簡體   English   中英

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
}

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM