Как отключить оптимизацию copy elision?

134
30 ноября 2019, 18:40

Ситуация заключается в том, что не могу отключить copy elision. В проекте присутствуют конструкторы с глобальными побочными эффектами. В результате "пропуска копии", при передаче в конструктор копирования объекта из функции - возникает поведение, которое недопустимо в имеющейся ситуации.

Необходимо производить некоторые действия во время вызова конструктора копирования. И вызов конструктора копирования должен происходить при копировании локального объекта перед выходом из функции, а затем - при копировании результата функции в другой объект.

Возможно ли отключить эту оптимизацию? Например, следующий пример (упрощенный) должен вызывать конструктор копии дважды:

T func(size_t Value)
{
T t { Value };
// ...
return t;// Первый вызов конструктора копии.
}
// ...
T t_var = func(x);// Второй вызов конструктора копии
Answer 1

Copy elision (aka RVO) для return работает только если выражение в return - это имя локальной не-volatile переменной (см. [class.copy] p31).

Используйте identity-функцию, тогда копирование при возврате значения не будет убираться.

template<typename T> const T& no_copy_elision(const T& t) { return t; }
T func() {
  T t;
  return no_copy_elision(t);
}

Либо можно попробовать использовать обычный static_cast<T>(t), или например в комбинации с volatile:

return static_cast<volatile T&>(t);

Однако VC++ может проигнорировать стандарт и всеравно сделать NRVO. Или применить какую-нибудь другую оптимизацию.
В любом случае, не следует использовать побочные эффекты при копировании, оно для этого не предназначено.

READ ALSO
Visual Studio Code Компиляция многофайлового проекта

Visual Studio Code Компиляция многофайлового проекта

Каким образом в Visual Studio Code можно организовать компиляцию многофайлового проектаК примеру имеется 3 файла: main

125
C++ Variadic templates

C++ Variadic templates

Здравствуйте есть следующий класс, со следующей реализацией:

120
Поиск заданной области в окне

Поиск заданной области в окне

В общем, такая задача: Сделать окно и поместить в него некоторую невидимую область и сделать так, чтобы при приближении к этой области курсора...

109