首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于C++中的优化问题

关于C++中的优化问题
EN

Stack Overflow用户
提问于 2011-09-22 23:21:47
回答 5查看 288关注 0票数 7

我读到过,C++标准允许优化到某种程度,它实际上会阻碍预期功能的实现。当我这样说的时候,我说的是返回值优化,你可能实际上在复制构造函数中有一些逻辑,但是编译器优化了调用。

我发现这有点糟糕,因为对于不知道这一点的人来说,可能需要花费相当长的时间来修复由此导致的bug。

我想知道的是,在其他情况下,来自编译器的过度优化可能会改变功能。

例如,如下所示:

代码语言:javascript
复制
int x = 1;
x = 1;
x = 1;
x = 1;

可以优化为单个x=1;

假设我有:

代码语言:javascript
复制
class A;

A a = b;
a = b;
a = b;

这也有可能被优化吗?可能不是最好的例子,但我希望你明白我的意思。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-22 23:26:58

取消复制操作是编译器被允许优化到副作用明显改变的程度的唯一情况。不要依赖于被调用的复制构造函数,编译器可能会优化掉这些调用。

对于其他任何事情," as - if“规则都适用:编译器可以随心所欲地进行优化,只要可见的副作用与编译器根本没有优化一样。

(“可见的副作用”包括,例如,写入控制台或文件系统的内容,但不包括运行时和CPU风扇速度。)

票数 12
EN

Stack Overflow用户

发布于 2011-09-22 23:27:30

这将取决于class A是如何实现的,编译器是否可以看到实现,以及它是否足够智能。例如,如果class A中的operator=()有一些副作用,这样的优化将改变程序的行为,这是不可能的。

票数 1
EN

Stack Overflow用户

发布于 2011-09-23 00:08:19

优化不会(用恰当的术语)“删除对复制或赋值的调用”。它将有限状态机转换为具有相同外部行为另一有限状态机。

现在,如果您反复调用

代码语言:javascript
复制
a=b; a=b; a=b; 

编译器做什么取决于operator=实际是什么。如果编译器发现调用没有机会改变程序的状态(并且“程序的状态”是“所有的生命周期都比作用域可以访问的作用域更长”),它就会把它去掉。如果这不能被“演示”,调用将留在原地。

无论编译器要做什么,都不要太担心:编译器不能(根据约定)更改程序的外部逻辑或程序的一部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7517260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档