Сообщение 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 чуть другие правила, да).
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 введено не для оптимизации (это побочный эффект), а для того, чтобы можно было на С++ фабрики нормально писать и возвращать из функций экземпляры классов, у которых нет конструкторов копирования или перемещения:
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
}