复制初始化和直接初始化的区别

来源:互联网 发布:去美国生孩子 知乎 编辑:程序博客网 时间:2024/05/21 21:56

昨天看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】),也称复制构造函数(忽然想到原来名字是这样来的,复制初始化)。总的来说更灵活和更高效要看情况而定。


0 0