Когда называются конструкторы? - PullRequest
5 голосов
/ 17 января 2009

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

Если я определю другой экземпляр класса глобально в файле, будет ли вызван этот конструктор при первой загрузке исполняемого файла? Что если несколько потоков обращаются к .dll?

Наконец, ответите ли вы на то же самое в исполняемых файлах .dll, .so, .exe и linux?

Ответы [ 3 ]

8 голосов
/ 17 января 2009

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

Когда это определено.

Если я определю другой экземпляр класса глобально в файле, будет ли вызван этот конструктор при первой загрузке исполняемого файла?

Да.

Что если несколько потоков обращаются к .dll?

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

1 голос
/ 17 января 2009

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

Такие переменные имеют локальную область видимости. Их конструктор вызывается, когда они определены. Для локальной статики конструктор вызывается только один раз, поскольку статика выдержит многократные вызовы функций и возвраты. Порядок важен, и это порядок определения:

void foo() {
    ....
    if(cond) {
        ...
        // called here: first for f, then for b
        static Foo f;
        static Bar b;
    }

    ...
    Foo f; // not static: called here, in every invocation of foo.
}

Если я определю другой экземпляр класса глобально в файле, будет ли вызван этот конструктор при первой загрузке исполняемого файла?

Да, говорят, что такая переменная имеет статическую продолжительность хранения и область имен. Его конструктор вызывается при запуске программы. Порядок - это порядок, определенный в файле. То есть переменная, определенная позже, будет иметь свой ctor, вызываемый позже. Порядок, в котором переменные определены в разных единицах перевода, не определен (обратите внимание на статический порядок инициализации fiasco ). Но все они вызываются при запуске программы.

Что если несколько потоков обращаются к .dll?

Все ставки сняты. Переменная строится только один раз. После этого, когда вы запускаете потоки и получаете к ним доступ, переменная должна быть потокобезопасной, или потоки должны выполнять надлежащую блокировку при доступе к переменной.

0 голосов
/ 21 января 2009

Для .dlls это зависит от компилятора и времени выполнения C (CRT). Для MSVC, выпущенного с Visual Studio 2008 SP1, CRT .dll инициализирует глобальные объекты во время DLL_PROCESS_ATTACH и уничтожает их во время DLL_PROCESS_DETACH, предполагая, что ничего страшного не произошло во время DLL_PROCESS_ATTACH.

...