[英]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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.