目录

1.copy elision说明

2.优化分析

3.如何关闭优化


1.copy elision说明

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

参考下面的程序。

#include <iostream>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。

C++构造与析构(12) - copy elision编译器优化相关推荐

  1. 浅谈C++11标准中的复制省略(copy elision,也叫RVO返回值优化)

    严正声明:本文系作者davidhopper原创,未经许可,不得转载. C++11以及之后的C++14.17标准均提出一项编译优化技术:复制省略(copy elision,也称复制消除),另外还有RVO ...

  2. 一道面试题:你了解哪些编译器优化行为?知道Copy elision 、RVO吗?

    C++11以后,g++ 编译器默认开启复制省略(copy elision)选项,可以在以值语义传递对象时避免触发复制.移动构造函数.copy elision 主要发生在两个场景: 函数返回的是值语义时 ...

  3. 声明及赋值_重述《Effective C++》二——构造、析构、赋值运算

    关于本专栏,请看为什么写这个专栏.如果你想阅读带有条款目录的文章,欢迎访问我的主页. 构造和析构一方面是对象的诞生和终结:另一方面,它们也意味着资源的开辟和归还.这些操作犯错误会导致深远的后果--你需 ...

  4. C++ Copy Elision

    故事得从 copy/move constructor 说起: The default constructor (12.1), copy constructor and copy assignment ...

  5. Copy Elision

    最近写程序的时候突然意识到了一个(也许大多数人早就意识到的)很常见的问题.我们知道复制一个对象(尤其是复杂的对象/实例)往往需要不小的计算开销(更别提复制一个数组的对象了).但另一方面,复杂对象(群) ...

  6. C++ Copy Elision 1

    故事得从 copy/move constructor 说起: The default constructor (12.1), copy constructor and copy assignment ...

  7. C++17之省略不必要的拷贝Copy Elision

    从C++发展历史看来,c++ 17引入了一个规则,要求在满足一定的条件下避免对象的复制,这在以前是可选的.C++17中一个叫做强制复制省略的技术就是基于这个观点的. 至少包括以下两项内容: 1. 返回 ...

  8. C++系列总结——构造与析构

    前言 在使用资源前,我们需要做一些准备工作保证资源能正常使用,在使用完资源后,我们需要做一些扫尾工作保证资源没有泄露,这就是构造与析构了,这和编程语言是无关的,而是使用资源的一种方式.C++只不过是把 ...

  9. (转)剖析Delphi中的构造和析构

    剖析Delphi中的构造和析构 1 Delphi中的对象模型: 2 1.1 对象名表示什么? 2 1.2 对象存储在哪里? 2 1.3 对象中存储了什么?它们是如何存储的? 3 2 构造函数与创建对象 ...

最新文章

  1. 中粮国际对话国际农民丰收节贸易会 谋定国际农贸现代化
  2. 机器学习(十七)——决策树, 推荐系统进阶
  3. Text Storage table
  4. 【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)
  5. Ruby小白入门笔记之Rubymine工具的快捷键
  6. 当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)
  7. php环境配置PHPWAMP
  8. 到底买苹果XS还是XR_iPhone XS和XR买哪个?10个理由告诉你XS更好,贵是有原因的!...
  9. 【Python】常用中英文词汇对照
  10. 什么是RSS?RSS是什么
  11. UI自动化框架 基于selenium+pytest和PO分层思想
  12. uni-app思维导图
  13. python echo(msg) 字符串_python的subprocess模块
  14. 【安全测试】什么是安全测试
  15. 在VMware中安装新版Ubuntu后,无法跨虚拟机复制粘贴和拖拽文件的解决方法
  16. 校园智能储物柜方案开发
  17. android 错误中英互译,Android 中英文切换及遇到的问题
  18. 级联以及什么是粗粒度、细粒度
  19. OLED显示屏I2C接口
  20. [汇编语言][bx]和loop指令

热门文章

  1. 软件工程 3:模块化设计
  2. php 获取array的长度_php中获取数组长度的方法
  3. Jump gameII
  4. Tiny C Compiler最小的C语言编译器
  5. workerman入门之GatewayWorker的使用
  6. 分析与思考 黄奇帆的复旦经济课 读书笔记
  7. 数据可视化是什么,数据可视化怎么做最好?
  8. python最强脚本工具_python脚本工具最百里自瞄
  9. c\c++: modifier, qualifier, specifier
  10. Word文档基本操作