Информация об изменениях

Сообщение Re[3]: Awaiting Review от 13.02.2019 12:55

Изменено 13.02.2019 13:24 watchmaker

Re[3]: Awaiting Review
Здравствуйте, Skorodum, Вы писали:


S>А на RVO есть хоть какая-то гарантия? Вроде же там как левая пятка компилятора захочет

S>Если же нужна гарантия, то ничего лучше указателей вроде еще не придумали. Или нет?

Guaranteed copy elision — в C++17 компилятор не имеет право копировать/перемещать объект. Даже если полностью выключить оптимизацию, и даже если его попробовать явно об этом попросить. Например, в gcc или clang можно передать ключ -fno-elide-constructors и сравнить генерируемый код для C++14 и C++17 — во втором случае return Object{...}; не будет копироваться или перемещаться.

(это именно для RVO, для NVRO чуть другие правила, да).
Re[3]: Awaiting Review
Здравствуйте, Skorodum, Вы писали:


S>А на RVO есть хоть какая-то гарантия? Вроде же там как левая пятка компилятора захочет

S>Если же нужна гарантия, то ничего лучше указателей вроде еще не придумали. Или нет?

Guaranteed copy elision — в C++17 компилятор не имеет право копировать/перемещать объект. Даже если полностью выключить оптимизацию, и даже если его попробовать явно об этом попросить. Например, в gcc или clang можно передать ключ -fno-elide-constructors и сравнить генерируемый код для C++14 и C++17 — во втором случае return Object{...}; не будет копироваться или перемещаться.

(это именно для RVO, для NVRO чуть другие правила, да).

Upd:
На всякий случай уточню, это guaranteed copy elision введено не для оптимизации (это побочный эффект), а для того, чтобы можно было на С++ фабрики нормально писать и возвращать из функций экземпляры классов, у которых нет конструкторов копирования или перемещения:
class Obj {
private:
    Obj(int); 
public:
    Obj(Obj&&) = delete;
    Obj(const Obj&) = delete;
};

Obj CreateObj() { 
  return Obj(4);  // нельзя до C++17
}