Нужно ли определять конструктор перемещения для класса только с элементами примитивного элемента, отличного от указателя? [Дубликат]

С ES5 + (любой просматриваемый в настоящее время - 2017) вы должны иметь возможность делать

[].forEach.call(document.getElementsByClassName('answer'), function(el) {
    el.style.color= 'red';
});

5
задан ildjarn 18 June 2012 в 18:23
поделиться

3 ответа

В блоге Скотта Мейера есть замечательная мысль:

Во-первых, не все запросы на копирование могут быть заменены ходами. Только запросы на копирование для rvalues ​​имеют право на оптимизацию. Во-вторых, не все типы поддерживают операции перемещения, которые более эффективны, чем операции копирования. Примером является std :: array. В-третьих, даже типы, которые поддерживают эффективные операции перемещения, могут поддерживать их только некоторое время. Пример: std :: string. Он поддерживает ходы, но в случаях, когда std :: string реализуется с использованием SSO (оптимизация небольших строк), маленькие строки так же дороги, как и для копирования!

Возможно, вы можете классифицируйте свои типы соответственно, а затем решите, для чего все нуждаются , перемещать семантику. Обратите внимание, что существуют ограничения на компилятор, автоматически генерирующий операции перемещения операторов / присваивания, поэтому вам было бы полезно помнить об этом. Это помогает, когда вы явно задаете элементы перемещения.

Для классов, в которых вы явно не указываете перемещать элементы, есть несколько точек беспокойства. Также существует проблема явно / неявно удаленных элементов перемещения, которые препятствуют копированию из rvalues ​​. Очень ценный источник проблем с неявной генерацией элементов перемещения можно найти в статье Страуструпа под названием To Move or Not to Move .

Что касается обработки исключений с семантикой перемещения, я бы предложил Сообщение Dave Abraham Исключительно перемещение .

Я попытаюсь вернуться к этому ответу с некоторыми примерами, когда я получу время. Надеюсь, пока ссылки, упомянутые выше, помогут вам начать работу.

10
ответ дан Ajrmatt 23 August 2018 в 01:40
поделиться
  • 1
    Это определенно заставило меня начать и думать. Он не ответил на некоторые из вопросов, на которые мне хотелось бы знать конкретные ответы, но это более чем достаточно для того, чтобы я начал учиться для себя. Большое спасибо. – Brandon 19 June 2012 в 02:01

В то время как движение - очень хороший инструмент в сумке, который позволяет намного больше, чем скорость. При перемещении вы перемещаете объект (очевидно) и не оставляете ничего позади (кроме пустого каркаса или, точнее, построенного по умолчанию объекта). Это заставляет вас думать более тщательно о владении и дизайне программы при перемещении объектов. Вместо множественного доступа к некоторым объектам или совместного использования, движение явно заставляет вас учитывать, кто имеет объект и когда.

Как ранее заявлял Бьярне Страуструп, мы должны прекратить делиться всем и иметь указатели повсюду. Если использование указателей использует unique_ptr, а не shared_ptr, если вы абсолютно не хотите делиться собственностью (что во многих случаях у вас нет). Unique_ptr и его перемещение только (хорошо удаленная копия в любом случае). Конструктор - хороший пример объекта, который должен обеспечивать перемещение и никогда не копировать.

Move is great, и писать конструкторы перемещения - очень хорошая идея, еще лучше, когда msvc ловит и разрешает удаленные / дефолтные декодеры на компиляторе, сгенерированном другим (копировать / назначать и т. д.). Ошибки, подобные попытке получить доступ к ранее удалённому элементу, очень полезны здесь, просто делая некоторые частные конструкторы менее очевидными намерениями для поддерживающего код. В случаях, когда копия в порядке, но предпочитайте двигаться, компилятор, мы надеемся, захочет переместиться, когда это возможно (т. Е. Протестируйте с помощью vector.push_back, который будет с некоторыми компиляторами перемещаться или emplace_back, если это разумно, покупая мгновенную прирост производительности), поэтому объекты-конструкторы экземпляров, может быть выбран автоматически выбранный конструктор перемещения, улучшая производительность (хорошо игнорируя все обсуждения SSO, которые бушуют в данный момент). Это достойный ответ peruse

. Есть несколько довольно тяжелых потоков в списке рассылки boost о преимуществах / недостатках перемещения / копирования и передачи по значению / ссылке, которые все очень много говорят о похожих проблемах, если вы ищете дополнительную информацию.

2
ответ дан Community 23 August 2018 в 01:40
поделиться
  • 1
    Я определенно оценил эту ссылку и объяснение. И тебе спасибо! Ссылка была наиболее определенно полезной. – Brandon 19 June 2012 в 02:03
1
ответ дан mdr 5 November 2018 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: