Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这两个选项中哪一个会更快地初始化对象?_C++ - Fatal编程技术网

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  
   }