생각도 못했다가 C++26 변경점 살펴보다 알게 됨 ㄷㄷ
C++에 익숙한 사람이라면 다들 알듯이 지나치게 큰 지역변수는 스택 오버플로를 일으킬 수 있다
하지만 정적지역변수는 스택이 아닌 정적 메모리 공간에 저장되므로 (데이터 영역) 스택오버플로를 일으키지 않는다
하지만 정적지역변수 자체가 아닌 정적지역변수의 정의는 스택오버플로를 일으킬 가능성이 있었다는 사실 ㄷㄷ
예를 들어 벡터는 초기화 리스트를 통해 정의되고 있는데
C++26 이전까지는 초기화 리스트를 통해 정적 지역변수를 정의할 경우
"스택"에 보조 배열을 만든 후 이를 다시 정적 메모리 공간의 정적 지역변수 객체 생성에 사용하는 방식으로 구현되었었다고 한다
C++26에서는 이짓거리를 못하게 초기화 리스트부터 정적 메모리 공간에서 생성되도록 강제했다고 한다
정말 상상도 못한 곳에서 튀어나오는 함정들 ㄷㄷ
이전 구현이 신기하네 스택에서 만들고 데이터 영역으로 옮기는 게 굳이 돌아가는 구현 아닌가 뭔가 이유가 있던 걸까
이해가 안되기는 함 스택오버플로랑 상관 없이 정적 공간 데이터를 만들기 위한 데이터는 당연히 또다른 정적 공간 데이터여야할 거 같은데 말이지.. 목표 데이터 생성후 지우더라도 ㅇㅇ
다시 생각해보니 정적 공간에 저장되는 놈들은 원래는 정적 주기를 전제로 하니까 코드 상으로는 임시 객체인 초기화리스트가 정적 공간에 들어가는건 맞지 않는다는 논리였으려나
그렇게 하면 lifetime이 간단함 저거 구현하려면 lifetime이 복잡해질듯 걍 뇌피셜임
그겅 배워봣장 쓸모가없능겡 코드취약점 에이전트 한번돌리명 정리됭 - dc App
그렇네 std::initializer_list가 크면 문제가 되겠네
어디서 가져옴? 나도 읽어볼래
아마 이 proposal인 듯
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2752r3.html
로컬에 static 정의 안 하면 그만