Использование memcpy в STL - PullRequest
0 голосов
/ 09 июня 2010

Почему векторный класс C ++ вызывает конструкторы копирования? Почему он не просто запоминает основные данные? Разве это не будет намного быстрее, и уберет половину потребности в семантике перемещения?

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

Ответы [ 2 ]

13 голосов
/ 09 июня 2010

Поскольку объект должен быть уведомлен о его перемещении.Например, могут быть указатели на данный объект, которые необходимо исправить, поскольку объект копируется.Или счетчик ссылок на интеллектуальном указателе со счетчиком ссылок может потребоваться обновить.Или ....

Если вы просто запрограммируете базовую память memcpy, то в итоге вы дважды вызовете деструктор для одного и того же объекта, что тоже плохо.Что если деструктор управляет чем-то вроде дескриптора файла ОС?

РЕДАКТИРОВАТЬ: Подводя итог вышесказанному: конструктор копирования и деструктор может иметь побочные эффекты.Эти побочные эффекты должны быть сохранены.

4 голосов
/ 09 июня 2010

Вы можете безопасно использовать memcpy POD и встроенные типы. Они определены как не имеющие семантики, кроме мешка с памятью.

Типы, которые имеют конструкторы и деструкторы, однако, должны быть построены и уничтожены, чтобы поддерживать инварианты. Хотя вы можете создавать типы, которые могут иметь memcpy'd и иметь конструкторы, это очень сложно выразить в сигнатуре типа. Таким образом, вместо возможного нарушения инвариантов, связанных со всеми типами, которые имеют конструкторы и / или деструкторы, STL допускает ошибки вместо поддержки инвариантов при использовании конструктора копирования при необходимости.

Именно поэтому в C ++ 0x добавлена ​​семантика перемещения через ссылки на rvalue. Это означает, что контейнеры STL могут использовать преимущества типов, которые предоставляют конструктор перемещения и предоставляют компилятору достаточно информации для оптимизации в противном случае дорогостоящей конструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...