string str="fujian";有些书说代码会触发复制构造函数,但g++会对其进行优化,这样复制构造函数就不会被调用。
但是,我使用g++命令-O0禁用了优化,但它仍然不能触发复制构造函数。
如何理解它?
发布于 2013-04-27 22:21:18
通过使用GCC和Clang,您可以使用-fno-elide-constructors编译标志来关闭复制/移动省略优化。
发布于 2015-04-12 22:09:13
复制省略规则基于ISO C++ 12.8。虽然通常用于优化的其他规则在第1款中统称为" as -if“规则(它允许实现生成与基于抽象机器模型的”非优化“程序语义略有不同的程序行为),但该规则是如此特殊,以至于您可以将”优化“代码本身的行为视为与原始含义一样精确。换句话说,省略的构造函数调用可能根本不存在于抽象机器的行为中。
如果没有未定义的行为,则根据as-if规则进行或不进行优化时,优化的程序和未优化的程序的可观察行为应该是相同的(尽管它们在性能等方面可能不同)。然而,复制省略更具攻击性,即它可以改变可观察到的行为。
你最好不要依赖于复制省略所产生的差异。因此,对于普通的优化选项保持相同的行为,并为知道风险并确实需要它的用户提供单独的选项来控制精确的(不同的)行为是合理的。
WG21/N4296
1.9程序执行
5执行格式良好的程序的一致性实现应产生与使用相同程序和相同输入的抽象机器的相应实例的可能执行之一相同的可观察行为。但是,如果任何这样的执行包含未定义的操作,本国际标准对使用该输入执行该程序的实现没有任何要求(即使是关于第一个未定义的操作之前的操作)。
8对一致性实现的最低要求是:
(8.1) -对易失性对象的访问严格按照抽象机的规则进行评估。
(8.2) -在程序终止时,所有写入文件的数据应与根据抽象语义执行程序所产生的可能结果之一相同。
(8.3) -交互设备的输入和输出动态应以这样的方式发生,即在程序等待输入之前实际传递提示输出。交互设备的构成是由实现定义的。
这些统称为程序的可观察行为。注意:抽象语义和实际语义之间更严格的对应关系可能由每个实现定义。-end笔记
12.8复制和移动类对象
31当满足某些标准时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。在这种情况下,该实现将省略的复制/移动操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的破坏发生在这两个对象在没有优化的情况下将被破坏的较晚时间。122这种称为复制省略的复制/移动操作的省略在以下情况下是允许的(可以组合以消除多个副本):
...
https://stackoverflow.com/questions/16253160
复制相似问题