2014-09-11 2 views
2

Так что для кода, как это:C++ статическая переменная в функции члена

class foo{ 
    void bar(){ 
    static int var = 2; 
    } 
}; 

Я знаю, что там будет только на экземпляре var для всех объектов типа foo но делает C++ выделяет память для переменной var еще до того, обув создано? Я спрашиваю об этом, потому что даже после того, как foo был уничтожен, var будет существовать во всей программе.

ответ

5

ли C++ выделяет память для переменной var еще до создания foo?

Да, это так, в том смысле, что память var будет в конечном счете забронирована заранее. Когда постоянное значение 2 записано в var, память имеет реализацию. Единственное, что стандартные гарантии - это то, что это произойдет в какой-то момент, прежде чем позвонить foo::bar().

Если вы инициализируете свою статическую переменную с помощью выражения с побочными эффектами (например, совершив вызов функции), этот вызов будет выполнен в первый раз, когда вы выполните функцию.

после того, как foo был разрушен, var будет существовать во всей программе.

var будет существовать независимо от любых случаев foo, которые могут быть созданы вашей программой. Когда вы вызываете foo::bar() в любое время, вы получите последнее значение var, указанное вашей программой.

+0

* before * первый вызов 'foo :: bar()'? Что, если начальное значение имело побочные эффекты? (разрешено в C++, а не в C) Связаны ли эти побочные эффекты в непредсказуемое время? –

+0

Распределение памяти не является инициализацией. * Инициализация * (ранее выделенной области памяти) произойдет именно в первый раз, когда вызывается функция. Следует отметить, что память будет распределяться статически при запуске программы, не используя 'malloc' или тому подобное. – 5gon12eder

+0

@BenVoigt Ах, эти надоедливые побочные эффекты! Благодаря! – dasblinkenlight

3

var будет построен первый раз foo: bar() называется. Он будет разрушен, когда программа завершится.

Обратите внимание, что foo класс, не экземпляр объекта, следовательно, foo никогда не «разрушен»

UPDATE: Стандарт говорит, что, что для хранения переменной выделяется при запуске программы. en.cppreference.com/w/cpp/language/storage_duration - (Спасибо broncoAbierto за исправление меня).

+0

'foo' никогда не уничтожается, но его статические члены * являются * частью процесса деинициализации программы. Для 'int', это, конечно, не-op. – 5gon12eder

+0

@ 5gon12eder: да, но OP ссылался на уничтожение foo как на что-то, что происходило до выключения. –

+0

В стандарте указано, что память для переменной выделяется при запуске программы. http://en.cppreference.com/w/cpp/language/storage_duration – broncoAbierto

Смежные вопросы