昨天看c++ primer的时候,看到一个新的名词,直接初始化和复制初始化,以前没接触c++的时候没有听说过这个区分,书上介绍到直接初始化语法更灵活且更高效。于是想验证一下有何不同。自己做了俩个试验,基本数据类型的俩种方式比较和对象的俩种方式比较。
1.基本类型
int a(1024); //直接初始化
00401907 mov dword ptr [ebp-28h],400h
int b = 1024; //复制初始化
0040190E mov dword ptr [ebp-2Ch],400h
可以看到基本类型的直接初始化和复制初始化经编译器编译之后的汇编代码是一样的,没什么区别。
2.对象类型(我这里只是内置对象string做实验)
string s1("abc");//直接初始化
00401915 lea edx,[ebp-54h]
00401918 push edx
00401919 push offset string "abc" (00436034)
0040191E lea ecx,[ebp-3Ch] //this指针,隐式传递
00401921 call @ILT+150(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_str//构造函数
00401926 mov byte ptr [ebp-4],1
string s2 = "abc";//复制初始化
0040192A lea eax,[ebp-58h]
0040192D push eax
0040192E push offset string "abc" (00436034)
00401933 lea ecx,[ebp-4Ch]//this指针,隐式传递
00401936 call @ILT+150(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_str//构造函数
可以看到对象类型的直接初始化和复制初始化经编译器编译之后的汇编代码是一样的,没什么区别。
由上可以知道其实直接初始化和复制初始化是差不多的,除了特殊的情况,重载=操作符或者类C的俩个对象A、B,A=B的时候,会调用拷贝构造函数(浅拷贝和深拷贝【编译器默认提供浅拷贝,如果编程者没有编写拷贝构造函数的话。介绍深浅拷贝http://www.cnblogs.com/CHYGO/articles/1916427.html】),也称复制构造函数(忽然想到原来名字是这样来的,复制初始化)。总的来说更灵活和更高效要看情况而定。