У меня возникли проблемы с пониманием семантики перемещения C++. Предположим, я хочу вернуть большой объект из метода. Чтобы сделать эту операцию эффективной, я использую конструктор перемещения для класса больших объектов. Я вызываю метод для получения большого объекта и передаю его другому методу, который будет обрабатывать его.Как работает конструктор перемещения?
processLargeObject(getLargeObject());
Я пишу метод getLargeObject()
где я создаю большой объект. Если я создам объект без нового оператора, мне дается понять, что хранилище выделено в стеке. В случае, когда я знаю размер объекта заранее и представляю его в массиве, этот большой объект может быть определен как double foo[1000000000];
. Теперь внутри конструктора двигаться, если я скажу,
foo = other.foo;
затем перемещенный объект будет по-прежнему находиться в стеке и может быть переписан в стеке расширяется.
Так что это не должно быть так, как используется конструктор перемещения. Должен ли конструктор перемещения использоваться только для перемещения объектов, находящихся в куче?
'foo = other.foo;' не будет компилироваться, если 'foo' - это массив удвоений. И как точно вы могли бы перемещать простой массив двойников? – Praetorian
Означает ли это, что мне нужно пройти через массив и создать копию? – AggieMan
Пробовали ли вы объявить и использовать объект с миллиардом удвоений в простом массиве? Кажется, хороший способ переполнить ваш стек.Вы должны использовать 'vector', и тогда перемещение действительно имеет смысл. –
Praetorian