Ciekawi mnie podstawowa implementacja zmiennych statycznych w funkcji.W jaki sposób inicjowana jest zmienna statyczna przez kompilator?
Jeśli zadeklaruję zmienną statyczną typu podstawowego (char, int, double itp.) I nadam jej wartość początkową, wyobrażam sobie, że kompilator po prostu ustawia wartość tej zmiennej na samym początku Program przed main()
nazywa się:
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;
}
jednak jeśli zmienna statyczna jest instancją klasy:
class MyClass
{
//...
};
void SomeFunction();
int main(int argCount, char ** argList)
{
SomeFunction();
}
void SomeFunction()
{
static MyClass myVar;
}
wiem, że nie zostaną zainicjowane dopiero po raz pierwszy, że funkcja jest wywoływana . Ponieważ kompilator nie ma możliwości poznania, kiedy funkcja zostanie wywołana po raz pierwszy, w jaki sposób generuje to zachowanie? Czy zasadniczo wprowadza on blok funkcyjny do ciała funkcji?
static bool initialized = 0;
if (!initialized)
{
// construct myVar
initialized = 1;
}
Czy coś się zmieniło? Słyszałem, że po C++ 11 każda inicjalizacja statyczna jest wątkowo bezpieczna. –
@VictorPolevoy: Tak - kiedy ta odpowiedź została napisana, C++ 11 nie istniało. W C++ 11 standard zawierał obsługę wątków, a to zostało dodane do opisu inicjalizacji zmiennych statycznych blokowych (6.7/4): "Jeśli formant wprowadza deklarację jednocześnie podczas inicjalizacji zmiennej, to współbieżne wykonanie musi czekać na zakończenie inicjalizacji ". –
Proponuję edytować odpowiedź, ponieważ jest ona akceptowana jako odpowiedź i ma 10 głosów. Również to pytanie jest najbardziej widoczne na temat inicjalizacji zmiennych statycznych. –