我正在尝试使用 RAII 创建在流上作用的对象,直到它们被销毁。例如,我有一个流,每当添加 endl 时都会自行刷新。大多数时候我想要这个,但并非总是如此。我希望能够说“不要在 endl 上刷新”,但我也需要它是异常安全的。所以我不能只做 stream->NoFlush() 来设置类成员。无论如何,我想知道的是这个。如果我有这样的代码

CStreamModifier no_flush;
stream->NoFlush(no_flush);
// as long as no_flush is in scope I get the behaviour I want

... do some stuff on the stream, without referencing no_flush ...

// no_flush goes out of scope here.

是否允许编译器优化 no_flush 的生命周期?例如,它不会在第 2 行之后使用,但我需要它一直使用到最后。我还没有真正听说过任何这样的优化,所以我认为我很好,但我想确定一下。

最佳答案

不,不允许编译器将其优化掉。当对象超出范围时,析构函数将被调用。

如果 NoFlush 按值获取参数,它可以做的是优化它的拷贝,但这无关紧要。

复制省略是编译器可以执行的唯一影响可观察行为的优化。

关于C++ 对象生命周期优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13617504/

10-09 06:22
查看更多