文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>拷贝初始化优化是强制的,还是可选的?

拷贝初始化优化是强制的,还是可选的?

时间:2010-08-19  来源:苏霈儿咪咪

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

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载