拷贝初始化优化是强制的,还是可选的?
时间: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的编译器都不好意思说自己支持什么优化。
- 因为标准没有强制拷贝初始化优化,所以拷贝构造函数最好只做拷贝相关的事,且保证优化与否,最终被构造的对象是相同的。道理很简单,我们希望优化与否不要影响代码逻辑。否则,代码行为可能会变得不确定。比如说你在拷贝构造函数中定义计数器来统计拷贝的次数。在不同编译器,甚至同一编译器不同时刻优化策略都会不同。这将不可避免导致拷贝计数的不精确性。
相关阅读 更多 +