博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++构造与析构(12) - copy elision编译器优化
阅读量:4070 次
发布时间:2019-05-25

本文共 1005 字,大约阅读时间需要 3 分钟。

目录


1.copy elision说明

Copy elision (或Copy omission)是一项编译器优化技术,用于避免不必要的对象拷贝。现如今基本上所有的编译器都使用它。

参考下面的程序。

#include 
class B{public: B(const char* str = "\0") //默认构造函数 { std::cout << "Constructor called" << std::endl; } B(const B &b) //拷贝构造函数 { std::cout << "Copy constructor called" << std::endl; }}; int main(){ B ob = "copy me"; return 0;}

输出结果:

Constructor called

2.优化分析

上面例子,为何没有调用拷贝构造函数?

按照正常的思维, 当一个对象 “ob”被创建时,会先调用一个带参数的构造函数,将"copy me"转换为一个临时对象,然后调用拷贝构造函数,将此临时对象拷贝给对象"ob". 这样的话,下面的这个表达式

     B ob = "copy me"; 
可以被编译器替换为:
     B ob = B("copy me");
然而,绝大多数的编译器都会避免掉这种开销。
现代的C++编译器会将下面的这个表达式
    B ob = "copy me"; //拷贝初始化
替换为:
    B ob("copy me"); //直接初始化
因此,省略掉了拷贝构造这一步。

3.如何关闭优化

当然,如果我们不想让编译器忽略掉拷贝构造函数,可以disable the copy elision, 方法就是在使用g++编译时,带上“-fno-elide-constructors”这个选项。

参考下面例子:
root@shltsh:~$ g++ copy_elision.cpp -fno-elide-constructors
root@shltsh:~$ ./a.out
  Constructor called
  Copy constructor called
如上所述,如果使用了这个编译选项,则先调用默认构造函数创建一个临时对象,然后调用拷贝构造函数将临时对象拷贝给ob。

转载地址:http://mqeji.baihongyu.com/

你可能感兴趣的文章
STM32中assert_param的使用
查看>>
C语言中的 (void*)0 与 (void)0
查看>>
vu 是什么
查看>>
io口的作用
查看>>
IO口的作用
查看>>
UIView的使用setNeedsDisplay
查看>>
归档与解归档
查看>>
Window
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
2. Add Two Numbers
查看>>
17. Letter Combinations of a Phone Number (DFS, String)
查看>>
93. Restore IP Addresses (DFS, String)
查看>>
19. Remove Nth Node From End of List (双指针)
查看>>
49. Group Anagrams (String, Map)
查看>>
139. Word Break (DP)
查看>>
23. Merge k Sorted Lists (Divide and conquer, Linked List) 以及java匿名内部类
查看>>
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>