Я считаю, что в D есть несколько мест (например, возвращаемые структуры), где D удается заставить их перемещаться, тогда как C++ сделал бы их копиями. IIRC, компилятор будет выполнять перемещение, а не копирование в любом случае, когда он может определить, что копия не нужна, поэтому копирование структуры будет происходить реже в D, чем в C++. И, конечно же, поскольку классы являются ссылками, у них вообще нет проблемы.
Но несмотря на это, конструкция копирования уже работает в D иначе, чем в C++. Как правило, вместо объявления конструктора копирования вы объявляете конструктор постблита: this(this)
. Он выполняет полный memcpy перед вызовом this(this)
, и вы вносите только те изменения, которые необходимы для обеспечения того, чтобы новая структура была отделена от исходной (например, при необходимости выполнялась глубокая копия переменных-членов), в отличие от создания совершенно новой структуры. конструктор, который должен все скопировать. Итак, общий подход уже немного отличается от C++. Также общепризнанно, что структуры не должны иметь дорогостоящих конструкторов постблитов - копирование структур должно быть дешевым - так что это не такая проблема, как в C++. Объекты, которые было бы дорого копировать, обычно представляют собой либо классы, либо структуры со ссылкой или семантикой COW.
Контейнеры, как правило, являются ссылочными типами (в Phobos это структуры, а не классы, поскольку им не нужен полиморфизм, но их копирование не копирует их содержимое, поэтому они по-прежнему являются ссылочными типами), поэтому их копирование не требует больших затрат. как это было бы в C++.
В D вполне могут быть случаи, когда он мог бы использовать что-то похожее на конструктор перемещения, но в целом D был разработан таким образом, чтобы уменьшить проблемы, которые C++ имеет с копированием объектов вокруг, так что это далеко не проблема. что это на С++.
person
Jonathan M Davis
schedule
17.11.2010