繁体   English   中英

为什么不能-O0禁用gcc编译优化?

[英]Why can't -O0 disable gcc compile optimization?

string str="fujian";

有些书说代码会触发复制构造函数,但是g ++会对它进行优化,以便不会调用复制构造函数。

但是,我使用g ++命令-O0来禁用优化,但它仍然无法触发复制构造函数。

怎么理解呢?

使用GCC和Clang,您可以使用-fno-elide-constructors elide -fno-elide-constructors编译标志来关闭复制/移动省略优化。

复制省略规则基于ISO C ++ 12.8。 虽然通常用于优化的其他规则在第1节中统称为“as-if”规则(这允许实现生成程序与基于抽象机器模型的“非优化”程序语义略有不同),但这个规则是如此特殊的,您可以对待“优化”代码本身的行为与原始含义一样精确。 换句话说,抽象机构的行为中可能根本不存在省略的构造函数调用。

如果没有未定义的行为,根据as-if规则进行或不进行优化,优化程序和非优化程序的可观察行为应该相同(尽管它们可能在性能上有所不同等)。 但是,复制省略更具侵略性,即它可以改变可观察的行为。

你最好不要依赖复制省略产生的差异。 因此,对于普通优化选项保持相同的行为是合理的,并提供单独的选项来控制那些知道风险并确实需要它的用户的精确(不同)行为。

WG21 / N4296

1.9程序执行

5执行格式良好的程序的符合实现应该产生与具有相同程序和相同输入的抽象机的相应实例的可能执行之一相同的可观察行为。 但是,如果任何此类执行包含未定义的操作,则此国际标准不要求使用该输入执行该程序的实现(甚至不考虑第一个未定义操作之前的操作)。

8对符合要求的实施的最低要求是:

(8.1) - 严格按照抽象机的规则评估对易失性对象的访问。

(8.2) - 在程序终止时,写入文件的所有数据应与根据抽象语义产生的程序执行的可能结果之一相同。

(8.3) - 交互设备的输入和输出动态应以在程序等待输入之前提示输出实际传送的方式进行。 构成交互设备的是实现定义的。

这些统称为程序的可观察行为 [注意:每个实现可以定义抽象和实际语义之间更严格的对应关系。 - 尾注]

12.8复制和移动类对象

31当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。 在这种情况下,实现将省略的复制/移动操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象的后期时间。在没有优化的情况下销毁.122在下列情况下允许复制/移动操作(称为复制省略)的这种省略(可以合并以消除多个副本):

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM