GCC가 정적 변수 (이미 내 함수에있는 변수)를 사용하기 위해 사용하는 내부 (숨겨진?) 변수를 식별하여 함수가 처음으로 호출되는 경우 식별 할 수있는 방법이 있습니까?기존의 정적 변수를 사용하여 첫 번째 호출을 식별 하시겠습니까?
나는이 변수들을 C++ 코드에서 얻을 수 있기를 희망한다.
GCC가 정적 변수 (이미 내 함수에있는 변수)를 사용하기 위해 사용하는 내부 (숨겨진?) 변수를 식별하여 함수가 처음으로 호출되는 경우 식별 할 수있는 방법이 있습니까?기존의 정적 변수를 사용하여 첫 번째 호출을 식별 하시겠습니까?
나는이 변수들을 C++ 코드에서 얻을 수 있기를 희망한다.
GCC는 변수가 초기화 된 경우를 나타내는 숨겨진 플래그를 사용합니다. 이 방법에 액세스 할 수있는 방법은 없습니다. 그럼에도 불구하고 이들은 실제로 "최초"를 추적하지 않고 변수가 초기화되었는지 여부를 추적합니다. 다음을 고려하십시오.
void func()
{
static T a;
static T b;
}
그러나 표준은 실제로 이들이 다른 스레드에 의해 초기화되는 것을 허용합니다. 그래서 어떤 일이 처음 일어 났을 때. 적어도 최적화되지 않은 모드에서는 자체 잠금으로 처리되는 것처럼 보이는 gcc 디스 어셈블리를 확인하면 코드가 최적화 모드로 많이 변경됩니다 (심지어 처음부터 명확하게 정의되지 않음).
또한 Mark는 자신의 의견에서 지적했듯이 초기화가 완료되었을 때 사용중인 유형에 따라 크게 달라집니다. 단순한 타입은 전역 적으로 초기화 될 수도 있고 보장되지 않을 수도 있으며, 다른 타입은 함수가 처음 호출 될 때까지 기다릴 것입니다.
왜 처음으로 항목을 알 필요가 있습니까?
컴파일러의 내부 구조에 의존 할 방법이 없으며, 시도하더라도 다음 버전에서는 변경되지 않을 것이라는 보장은 없습니다.
사용이 일반적인 관용구 :
static bool firsttime = true;
if (firsttime)
{
firsttime = false;
// other stuff here
}
그것은 참으로 좋은 관용구이며, 다른 일을하려는 사람은 미친 정신 병원에 보내야합니다. 그럼에도 불구하고 GCC에서하고 싶은 일을 할 수 있습니까? – Mikhail
@Misha, 간단한 POD 유형은 컴파일 할 때 초기화되며 런타임 지원은 필요하지 않습니다. 생성자가 필요하거나 런타임 값으로 초기화되는 정적 변수는 코드 줄이 실행될 때 초기화되지만 gcc가 어떤 메커니즘을 사용하는지 알지 못합니다. 대답에서 말했듯이, gcc는 매 릴리스마다 메커니즘을 자유롭게 변경할 수 있으므로 알아 내려고 시도하는 것은 정말 미친 일입니다. –
스레드 안전성 측면에서 볼 때 여러 호출자가 처음 블록에 종료 될 수 있으므로 이는 좋은 관용구가 아닙니다. –