如果我在不使用指针和new的情况下在函数中途定义了一个类的局部变量实例,是否在进入函数或定义函数时调用构造函数?
如果我在文件中全局定义另一个类的实例,那么在首次加载可执行文件时会调用该构造函数吗?如果多个线程正在访问.dll会怎么样?
最后你回答的是.dll,.so,.exe和linux可执行文件中的相同内容吗?
答案 0 :(得分:8)
如果我在不使用指针和new的情况下在函数中间定义了一个类的局部变量实例,那么构造函数是否会被调用o进入函数或定义它的位置?
定义时。
如果我在文件中全局定义另一个类的实例,那么在首次加载可执行文件时会调用该构造函数吗?
是
如果多个线程正在访问.dll会怎样?
DLL通常只为整个应用程序加载一次 - 事实上,DLL也有一个入口点,由应用程序的线程调用,但全局变量初始化在此之前发生,只发生一次。
答案 1 :(得分:1)
如果我在不使用指针和new的情况下在函数中途定义了一个类的局部变量实例,是否在进入函数或定义函数时调用构造函数?
此类变量具有局部范围。它们的构造函数在定义时被调用。对于局部静态,构造函数只被调用一次,因为静态将在多个函数调用和返回后存活。订单很重要,是定义的顺序:
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会怎样?
所有赌注都已关闭。变量只构造一次。之后,当您启动线程并访问它时,该变量必须是线程安全的,或者线程在访问变量时必须进行适当的锁定。
答案 2 :(得分:0)
对于.dll,它取决于编译器和C运行时(CRT)。对于随Visual Studio 2008 SP1发布的MSVC,.dll的CRT将在DLL_PROCESS_ATTACH
时初始化全局对象并在DLL_PROCESS_DETACH
时销毁它们,假设在DLL_PROCESS_ATTACH
期间没有发生任何可怕的事情。