我正在尝试使用 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/