Если я определяю экземпляр локальной переменной класса на полпути вниз по моей функции без использования указателя и нового, вызывается ли конструктор при входе в функцию или где она определена?
Такие переменные имеют локальную область видимости. Их конструктор вызывается, когда они определены. Для локальной статики конструктор вызывается только один раз, поскольку статика выдержит многократные вызовы функций и возвраты. Порядок важен, и это порядок определения:
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?
Все ставки сняты. Переменная строится только один раз. После этого, когда вы запускаете потоки и получаете к ним доступ, переменная должна быть потокобезопасной, или потоки должны выполнять надлежащую блокировку при доступе к переменной.