Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16329
  • 博文数量: 6
  • 博客积分: 271
  • 博客等级: 二等列兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 21:10
个人简介

地沟油问题跟三氯氰胺的奶粉是一回事,监管环节有漏洞

文章分类

全部博文(6)

文章存档

2011年(1)

2010年(5)

我的朋友

分类: C/C++

2010-08-19 16:43:32

ISO C++ Standard 2003给出的描述是:“In certain cases, an implementation is permitted to eliminate the copying inherent in this direct-initialization by constructing the intermediate result directly into the object being initialized。”

因为T x = a相当于T x(T(a)),上段C++标准大意是允许编译器直接将中间结果T(a)构造在x的地址空间,这样就无需再将T(a)拷贝到x了。注意C++标准用的“允许”而不是“强制”。换句话说,编译器可据自己心情选择优化与否,甚至可选择时优时不优。幸运的是,大多数现代编译器都会很敬业地选择优化,如VC9,GCC等。

其它解释
  • 拷贝构造函数私有化经常用来阻止对象拷贝。但对GCC这样的编译器来说,这也意味着同时阻止拷贝初始化(见上篇)。如果程序员对拷贝初始化没有深入了解,可能会感到迷茫。
  • explicit阻止所要形式拷贝初始化,包括参数传递,函数返回,大括号初始化列表等。最常见的例子就是智能指针如std::auto_ptr。
  • 大多数现代编译器支持拷贝初始化优化。最著名优化应该要算NRV(named return value)。不支持NRV的编译器都不好意思说自己支持什么优化。
  • 因为标准没有强制拷贝初始化优化,所以拷贝构造函数最好只做拷贝相关的事,且保证优化与否,最终被构造的对象是相同的。道理很简单,我们希望优化与否不要影响代码逻辑。否则,代码行为可能会变得不确定。比如说你在拷贝构造函数中定义计数器来统计拷贝的次数。在不同编译器,甚至同一编译器不同时刻优化策略都会不同。这将不可避免导致拷贝计数的不精确性。
阅读(546) | 评论(0) | 转发(0) |
0

上一篇:Google C++编程风格指南

下一篇:Linux主机名

给主人留下些什么吧!~~