История изменений
Исправление Siborgium, (текущая версия) :
делаем лишнее копирование
из-за того, что может понадобиться реаллокация, которая может зафейлить.
Нет. Делаем, потому что не можем делать иначе – в языке просто не было средств выразить emplace.
В плюсах еще не было перемещения, но это относительно тривиально
Нет, это не тривиально – в языке не было способа показать, что ты хочешь вместо копирования перемещение. Ты мог придумывать какие-то дополнительные аргументы в конструктор копирования, какие-то флаги, но это все костыли.
emplace от push_back отличается вообще не копированием, копирование никакого значения не имеет. push_back – это конструкция объекта из объекта, передаваемого аргументом. Это может быть move, это может быть копирование – неважно, ключ в том, что объект создается из объекта. emplace конструирует объект на месте, и не из другого объекта, а из произвольных аргументов, которые emplace просто передает в конструктор. Ты не можешь написать emplace без форвардинга и вариадиков – это просто невозможно сделать в общем случае. Можно захардкодить какой-то конкретный, но это бесполезно, это ничем не лучше сишки.
что код, который не генерирует ни одной инструкции в конечный бинарь, остаётся динамическим
Речь не о инструкциях, а о семантике.
Исходная версия Siborgium, :
делаем лишнее копирование
из-за того, что может понадобиться реаллокация, которая может зафейлить.
Нет. Делаем, потому что не можем делать иначе.
В плюсах еще не было перемещения, но это относительно тривиально
Нет, это не тривиально – в языке не было способа показать, что ты хочешь вместо копирования перемещение. Ты мог придумывать какие-то дополнительные аргументы в конструктор копирования, какие-то флаги, но это все костыли.
emplace от push_back отличается вообще не копированием, копирование никакого значения не имеет. push_back – это конструкция объекта из объекта, передаваемого аргументом. Это может быть move, это может быть копирование – неважно, ключ в том, что объект создается из объекта. emplace конструирует объект на месте, и не из другого объекта, а из произвольных аргументов, которые emplace просто передает в конструктор. Ты не можешь написать emplace без форвардинга и вариадиков – это просто невозможно сделать в общем случае. Можно захардкодить какой-то конкретный, но это бесполезно, это ничем не лучше сишки.
что код, который не генерирует ни одной инструкции в конечный бинарь, остаётся динамическим
Речь не о инструкциях, а о семантике.