Оптимизация времени жизни объекта C ++

Я пытаюсь использовать 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

Решение

Нет, компилятору не разрешено это оптимизировать. Деструктор будет вызываться именно тогда, когда объект выходит из области видимости.

Что он может сделать, это оптимизировать его копии, если NoFlush принимает параметр по значению, но это не должно иметь значения.

Исключение копирования — единственная оптимизация, которую может выполнить компилятор, которая влияет на наблюдаемое поведение.

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
}
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector