LINUX.ORG.RU

История изменений

Исправление Siborgium, (текущая версия) :

делаем лишнее копирование

из-за того, что может понадобиться реаллокация, которая может зафейлить.

Нет. Делаем, потому что не можем делать иначе – в языке просто не было средств выразить emplace.

В плюсах еще не было перемещения, но это относительно тривиально

Нет, это не тривиально – в языке не было способа показать, что ты хочешь вместо копирования перемещение. Ты мог придумывать какие-то дополнительные аргументы в конструктор копирования, какие-то флаги, но это все костыли.

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

что код, который не генерирует ни одной инструкции в конечный бинарь, остаётся динамическим

Речь не о инструкциях, а о семантике.

Исходная версия Siborgium, :

делаем лишнее копирование

из-за того, что может понадобиться реаллокация, которая может зафейлить.

Нет. Делаем, потому что не можем делать иначе.

В плюсах еще не было перемещения, но это относительно тривиально

Нет, это не тривиально – в языке не было способа показать, что ты хочешь вместо копирования перемещение. Ты мог придумывать какие-то дополнительные аргументы в конструктор копирования, какие-то флаги, но это все костыли.

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

что код, который не генерирует ни одной инструкции в конечный бинарь, остаётся динамическим

Речь не о инструкциях, а о семантике.