2013-12-01 4 views
3

Здесь есть такой же вопрос: When exactly is constructor of static local object called?C++ - вызов конструктора глобального статического объекта и локального статического объекта отличается?

, но он упоминает только о локальном статическом объекте, поэтому я хочу добавить еще один случай для глобального статического объекта.

Скажем, у нас есть два примера такой код:

экзамен 1. локальная статическая ==========

class Mix { 
Mix() { //the ctor code } 
}; 

Mix& globalFunction() 
{ 
static Mix gMix; // when its ctor execute ? 
return gMix; 
} 

экзамен 2. глобальный статический === =======

class Mix { 
Mix() { //the ctor code } 
static MyClass MReen; // when its ctor execute ? 
}; 

//initialization static var 
MyClass Mix::MReen = 0 ; 
  • Когда именно 'код конструктора' Выполнено 2 статических объекта выше?
  • Как это работает на разных языках: g ++ (работает в Linux) и компиляторе VC++?

Благодаря

+0

'Микс :: MReen = 0' - это назначение, а не инициализация, и это запрещено в глобальном масштабе. добавьте 'MyClass' к нему, чтобы сделать его инициализацией, хотя инициализация до 0 является избыточной. – uk4321

+0

Ответ здесь: http://stackoverflow.com/questions/246564/what-is-the-lifetime-of-a-static-variable-in-a-c-function –

+0

Спасибо, мне не хватало MyClass. Обновлено. –

ответ

2
  1. Локальная статическая переменная, объявленные в функции, инициализируется перед первым вызовом функции. Подробнее об этих аспектах стандарта C++ вы можете узнать здесь https://stackoverflow.com/a/58804/747050.
  2. Глобальная статическая переменная инициализируется до main(), но если у вас несколько файлов, заказ не застрахован даже в одном компиляторе. Здесь приведены ответы: http://www.parashift.com/c++-faq/static-init-order.html, Can the compiler deal with the initialization order of static variables correctly if there is dependency?

    p.s. Вы можете гарантировать порядок сопзИте статики с одной уловкой:

    int YourClass::YourStaticVar() 
    { 
        static const int value = 0; 
        return value; 
    } 
    
+0

Многие компиляторы упорядочивают создание статических объектов по порядку объектных файлов во время связывания. Если это так, это следует упомянуть в документах для компилятора. –

+0

Что означает ваше первое предложение? Какой вызов функции? – EJP

+0

@EJP, в этом случае вызов globalFunction(). – klm123

3

Я пытаюсь проверить снова код из Адама Пирс в here, и добавили еще два случая: статические переменных в классе и POD типа. Мой компилятор - g ++ 4.8.1, в ОС Windows (MinGW-32). Результат статической переменной в классе обрабатывается с глобальной переменной. Его конструктор будет вызываться перед вводом основной функции.

  • Заключения (для г ++, среда Windows):

    1. глобальных переменной и статического члена в классе: конструктор вызывается перед входом основного функция (1) ,
    2. Локальная статическая переменная: конструктор вызывается только тогда, когда выполнение достигает своего объявления в первый раз.
    3. Если Локальная статическая переменная СТРУЧОК типа, то он также инициализируется перед входом Основная функция(1). Пример для типа POD: статическое число int = 10;

(1): Правильное состояние должно быть: "перед любой функцией от одной и той же единицы трансляции называется". Однако для простых, как в примере ниже, это main функция.

< включают iostream>

#include < string> 

using namespace std; 

class test 
{ 
public: 
    test(const char *name) 
      : _name(name) 
    { 
      cout << _name << " created" << endl; 
    } 

    ~test() 
    { 
      cout << _name << " destroyed" << endl; 
    } 

    string _name; 
    static test t; // static member 
}; 
test test::t("static in class"); 

test t("global variable"); 

void f() 
{ 
    static test t("static variable"); 
    static int num = 10 ; // POD type, init before enter main function 

    test t2("Local variable"); 
    cout << "Function executed" << endl; 
} 

int main() 
{ 
    test t("local to main"); 
    cout << "Program start" << endl; 
    f(); 
    cout << "Program end" << endl; 
    return 0; 
} 

результат:

static in class created 
global variable created 
local to main created 
Program start 
static variable created 
Local variable created 
Function executed 
Local variable destroyed 
Program end 
local to main destroyed 
static variable destroyed 
global variable destroyed 
static in class destroyed 

Anybody протестирована в Linux окр?

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