4

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行目以降は使用されていませんが、最後までそのままにしておく必要があります。このような最適化についてはあまり聞いたことがないので、大丈夫だと思いますが、確認したいと思います。

4

2 に答える 2

2

いいえ、コンパイラはそれを最適化することを許可されていません。オブジェクトがスコープ外になると、デストラクタが正確に呼び出されます。

パラメータを値で取得する場合、そのコピーを最適化することができますが、それNoFlushは問題ではありません。

コピーの省略は、コンパイラーが実行できる唯一の最適化であり、観察可能な動作に影響を与えます。

于 2012-11-29T01:45:56.653 に答える
2

私はこのようにします:

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
}
于 2012-11-29T01:47:16.203 に答える