C++对象生存期优化
C++ object lifetime optimizations
我正在尝试使用 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
按值获取参数,它可以做的是优化它的副本,但这无关紧要。
复制省略是编译器可以执行的唯一影响可观察行为的优化。
我会这样做:
struct Stream
{
bool flush = true;
// ...
};
struct NoFlush
{
explicit NoFlush(Stream & s)
: stream(s)
, prev(stream.flush)
{ stream.flush = false; }
~NoFlush()
{ stream.flush = prev; }
Stream & stream;
bool prev;
};
现在你可以像这样使用它:
void foo(T arg, S brg, Stream & stream)
{
NoFlush _(stream);
// do stuff
}
相关文章:
- GCC对可能有效的代码抛出init list生存期警告
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 创建具有全局生存期的 UObject
- C++17 和静态临时生存期的参考扩展
- 数组对象的生存期是否在重用其元素存储时结束?
- 共享指针生存期
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 指针引用的生存期(以 C++为单位)
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 全局静态生存期?他们会让你的程序崩溃吗?
- "std::function"的简单版本:函数对象的生存期?
- 您能否根据是否使用返回值来保证不同的生存期行为?
- 理解C++指针生存期/僵尸指针
- C++对象生存期优化