함수 내에서 정적 변수의 기본 구현에 대해 궁금합니다.정적 변수 초기화는 컴파일러에서 어떻게 구현됩니까?
기본 유형 (char, int, double 등)의 정적 변수를 선언하고 초기 값을 지정하면 컴파일러가 해당 변수의 값을 변수의 맨 처음에 간단하게 설정한다고 생각합니다. main()
전에 프로그램이 호출됩니다
void SomeFunction();
int main(int argCount, char ** argList)
{
// at this point, the memory reserved for 'answer'
// already contains the value of 42
SomeFunction();
}
void SomeFunction()
{
static int answer = 42;
}
그러나, 정적 변수는 클래스의 인스턴스 인 경우 :
class MyClass
{
//...
};
void SomeFunction();
int main(int argCount, char ** argList)
{
SomeFunction();
}
void SomeFunction()
{
static MyClass myVar;
}
나는이 함수가 호출되는 것은 이번이 처음 때까지 초기화되지 않을 것이라는 점을 알고있다 . 컴파일러는 함수가 처음 호출 될 때를 알 수있는 방법이 없으므로 어떻게이 동작을 생성합니까? 그것은 본질적으로 함수 본문에 if 블록을 도입합니까?
static bool initialized = 0;
if (!initialized)
{
// construct myVar
initialized = 1;
}
변경 되었습니까? 나는 C++ 11 이후 정적 초기화가 스레드로부터 안전하다는 말을 들었다. –
@VictorPolevoy : 예 -이 대답이 작성되면 C++ 11이 존재하지 않습니다. C++ 11에서 표준에는 스레드 지원이 포함되어 있으며 이것은 블록 범위 정적 변수 (6.7/4)의 초기화 설명에 추가되었습니다. "변수가 초기화되는 동안 컨트롤이 동시에 선언에 들어가면 동시 실행 초기화 완료를 기다려야한다. " –
답변을 수락하고 10 표를 얻었으므로 답변을 수정 해주십시오. 또한이 질문은 정적 변수의 초기화 주제와 함께 가장 많이 볼 수 있습니다. –