C++ 这两个选项中哪一个会更快地初始化对象?
或C++ 这两个选项中哪一个会更快地初始化对象?,c++,C++,或 哪一个可以更快地初始化对象?或者,最终是否会为这两者生成相同的代码,并且初始化所需的时间将保持不变?还是取决于编译器?对于POD成员,包括int,它们将是相同的,因为不会构造两次成员 对于具有默认构造函数的类型,第二个将更快,因为第一个选项等效于: class B { public: int b; B(int x):b(x){} }; 如果a是B类型的成员(具有默认构造函数) 请注意,在某些情况下,必须使用初始值设定项列表:const成员、引用成员
哪一个可以更快地初始化对象?或者,最终是否会为这两者生成相同的代码,并且初始化所需的时间将保持不变?还是取决于编译器?对于POD成员,包括
int
,它们将是相同的,因为不会构造两次成员
对于具有默认构造函数的类型,第二个将更快,因为第一个选项等效于:
class B {
public:
int b;
B(int x):b(x){}
};
如果a
是B
类型的成员(具有默认构造函数)
请注意,在某些情况下,必须使用初始值设定项列表:const
成员、引用成员、没有默认构造函数的类类型的成员
POD成员:
没有初始值设定项列表:
初始值设定项列表:
i、 e.相同,这是因为a
在进入构造函数主体之前没有初始化
非POD成员:
没有初始值设定项列表:
初始值设定项列表:
i、 e.初始值设定项列表选项更好。对于本机类型,这是相同的,因为它们通常不会在主体之前初始化。虽然两者在语义上不同,但是
int
不太可能有明显的差异。唯一能确定的方法是对这两个方面都进行分析。@我想,在这里,胡安科潘扎的分析不会太有用。本地类型指的是内置的数据类型?如果分析没有用,那么就没有区别,这是一个不成问题的问题。速度甚至不应该是一个考虑因素。正确地做这件事应该是唯一的办法。让编译器担心它的速度。为什么会有不同?当然编译器可以为两者编写相同的代码。@DavidHeffernan我认为编译器在这种情况下不能省略默认结构。@juanchopanza为什么不能?“仿佛”原则是否被中止?@DavidHeffernan好的,至少也一样快。如果默认构造函数中存在可观察的逻辑,则省略将是非法的。@DavidHeffernan我认为可以实际省略默认构造函数的唯一方法是,如果默认构造函数和赋值都可以内联,然后可以确定默认构造函数是死存储(作为赋值的结果)。这就是你的意思,还是你有其他想法?
class B {
public:
int b;
B(int x):b(x){}
};
A(B x) : a()
{
a = x;
}
A(int x)
001F1430 push ebp
001F1431 mov ebp,esp
001F1433 sub esp,0CCh
001F1439 push ebx
001F143A push esi
001F143B push edi
001F143C push ecx
001F143D lea edi,[ebp-0CCh]
001F1443 mov ecx,33h
001F1448 mov eax,0CCCCCCCCh
001F144D rep stos dword ptr es:[edi]
001F144F pop ecx
001F1450 mov dword ptr [ebp-8],ecx
{
a = x;
001F1453 mov eax,dword ptr [this]
001F1456 mov ecx,dword ptr [x]
001F1459 mov dword ptr [eax],ecx
}
A(int x) : a(x)
00E71430 push ebp
00E71431 mov ebp,esp
00E71433 sub esp,0CCh
00E71439 push ebx
00E7143A push esi
00E7143B push edi
00E7143C push ecx
00E7143D lea edi,[ebp-0CCh]
00E71443 mov ecx,33h
00E71448 mov eax,0CCCCCCCCh
00E7144D rep stos dword ptr es:[edi]
00E7144F pop ecx
00E71450 mov dword ptr [ebp-8],ecx
00E71453 mov eax,dword ptr [this]
00E71456 mov ecx,dword ptr [x]
00E71459 mov dword ptr [eax],ecx
00EB1A80 push ebp
00EB1A81 mov ebp,esp
00EB1A83 sub esp,0CCh
00EB1A89 push ebx
00EB1A8A push esi
00EB1A8B push edi
00EB1A8C push ecx
00EB1A8D lea edi,[ebp-0CCh]
00EB1A93 mov ecx,33h
00EB1A98 mov eax,0CCCCCCCCh
00EB1A9D rep stos dword ptr es:[edi]
00EB1A9F pop ecx
00EB1AA0 mov dword ptr [ebp-8],ecx
00EB1AA3 mov ecx,dword ptr [this]
00EB1AA6 call B::B (0EB11D6h)
{
a = b;
}
00EB1AAB mov eax,dword ptr [this]
00EB1AAE pop edi
00EB1AAF pop esi
00EB1AB0 pop ebx
00EB1AB1 add esp,0CCh
00EB1AB7 cmp ebp,esp
00EB1AB9 call @ILT+315(__RTC_CheckEsp) (0EB1140h)
00EB1ABE mov esp,ebp
00EB1AC0 pop ebp
00EB1AC1 ret 4
A(B b) : a(b)
{
00841650 push ebp
00841651 mov ebp,esp
00841653 sub esp,0CCh
00841659 push ebx
0084165A push esi
0084165B push edi
0084165C push ecx
0084165D lea edi,[ebp-0CCh]
00841663 mov ecx,33h
00841668 mov eax,0CCCCCCCCh
0084166D rep stos dword ptr es:[edi]
0084166F pop ecx
00841670 mov dword ptr [ebp-8],ecx
}