class A {
public:
int a;
A(int x)
{
a = x;
}
};
Run Code Online (Sandbox Code Playgroud)
要么
class B {
public:
int b;
B(int x):b(x){}
};
Run Code Online (Sandbox Code Playgroud)
哪一个会更快地初始化对象?或者最终会为两者生成相同的代码,初始化所需的时间将保持不变?或者它取决于编译器?
对于POD成员,包括int,它们将是相同的,因为该成员将不会被构造两次.
对于具有默认构造函数的类型,第二个将更快,因为第一个选项等效于:
A(B x) : a()
{
a = x;
}
Run Code Online (Sandbox Code Playgroud)
if a是类型的成员B(使用默认构造函数).
请注意,在某些情况下您必须使用初始化程序列表:const成员,引用成员,没有默认构造函数的类类型的成员.
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
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
即相同,那是因为a在进入构造函数体之前没有初始化.
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
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
即初始化列表选项更好.