JBe*_*Fat 7 c++ constructor default-constructor compiler-optimization
我有一个普遍的问题,可能是一个特定的编译器.我对调用构造函数的条件感兴趣.具体来说,在针对速度优化的发布模式/版本中,在实例化对象时是否始终会调用编译器生成的或空的构造函数?
class NoConstructor
{
int member;
};
class EmptyConstructor
{
int member;
};
class InitConstructor
{
InitConstructor()
: member(3)
{}
int member;
};
int main(int argc, _TCHAR* argv[])
{
NoConstructor* nc = new NoConstructor(); //will this call the generated constructor?
EmptyConstructor* ec = new EmptyConstructor(); //will this call the empty constructor?
InitConstructor* ic = new InitConstructor(); //this will call the defined constructor
EmptyConstructor* ecArray = new EmptyConstructor[100]; //is this any different?
}
Run Code Online (Sandbox Code Playgroud)
我已经做了很多搜索,并花了一些时间查看Visual Studio中生成的汇编代码.但是,在发布版本中可能很难遵循.
总结:构造函数总是被调用吗?如果是这样,为什么?
我知道这很大程度上取决于编译器,但肯定有一个共同的立场.您可以引用的任何示例/来源都将非常感激.
Kon*_*lph 15
在实例化对象时,是否会始终调用编译器生成的构造函数/空构造函数?
不.如果您的类是所谓的"POD"(普通旧数据),则不会始终调用编译器生成的构造函数.
具体而言,在以下两种情况下不会调用它:
struct Pod {
int x;
};
int main() {
Pod pod;
std::cout << pos.x << std::endl; // Value undefined.
Pod pod2 = Pod(); // Explicit value initialization.
Pod* pods = new Pod[10];
// Values of `pods` undefined.
Pod* pods2 = new Pod[10](); // Explicit value initialization.
}
Run Code Online (Sandbox Code Playgroud)
确切类型是POD的条件有点棘手.在C++中常见问题有一个很好的细分.
小智 5
在优化模式下,如果您的类或结构是POD(仅具有POD类型)并且未指定构造函数,则任何生产质量C++编译器不仅会跳过对构造函数的调用,甚至不会生成它.
如果您的类具有必须调用构造函数的非POD成员,则编译器将生成调用成员构造函数的默认构造函数.但即便如此 - 它也不会初始化POD类型.即如果你没有member
明确初始化,你可能会在那里结束垃圾.
如果您的编译器/链接器具有LTO,那么整个事情甚至会变得很奇怪.
希望能帮助到你!并使您的程序首先运行,然后使用分析器检测缓慢的位置,然后优化它.过早优化可能不仅会使您的代码难以理解并浪费大量时间,而且根本无法提供帮助.你必须先知道要优化什么.
以下是示例中代码的反汇编(x86_64,gcc 4.4.5):
main:
subq $8, %rsp
movl $4, %edi
call _Znwm
movl $4, %edi
movl $0, (%rax)
call _Znwm
movl $4, %edi
movl $0, (%rax)
call _Znwm
movl $400, %edi
movl $3, (%rax)
call _Znam
xorl %eax, %eax
addq $8, %rsp
ret
Run Code Online (Sandbox Code Playgroud)
如您所见,根本没有调用构造函数.根本没有类,每个对象只是一个4字节的整数.
使用MS编译器,YMMV.所以你必须自己检查一下拆卸.但结果应该是相似的.
祝好运!
归档时间: |
|
查看次数: |
4522 次 |
最近记录: |