C++ memcpy и сохранность ссылок и прочего
Всем привет! У меня несколько абстрактный вопрос: Я делаю собственный вектор и насмотревшись гадов по его созданию задался вопросом, а почему все так боятся использовать memcpy? И realloc тоже? Это же удобные функции для того,чтобы не вызывать ненужные конструкторы, ведь объекты же не меняются по факту,так как вектор лишь увеличивается при добавлении элемента. Но все упорно используют кривые циклы с приравнивание или вообще new/delete которые вызывают деструктор в и конструкторы, хотя ты только хотел добавлять вектор.
P.S. вообще почему векторы не делать на malloc и free? Тогда никаких вызовов деструкторов и конструкторов без необходимости.
Ответы (1 шт):
Представьте класс, который сохраняет свой адрес в какую-то глобальную переменную (мапу?). В своих копирующих (если они не удалены) и перемещающих операциях он бы обновлял этот глобальный объект. А вы, используя memcpy вместо правильных конструкторов и операторов присваивания, сломали бы эту логику.
Стандарт запрещает использовать memcpyна классах с нетривиальными копирующими или перемещающими операциями (т. е. такими, которые не просто копируют байты).
все упорно используют кривые циклы
Это единственный легальный способ.
не вызывать ненужные конструкторы
Если они и правда ненужные, то по хорошему компилятор должен сам их выбросить (если их почему-то не спрятали из хедера в .cpp-шник).
почему векторы не делать на malloc и free?
Только на них и можно (или на operator new() и operator delete(), которые ведут себя так же), потому что new и delete не позволят зарезервировать память, не создавая сразу в ней объекты.
Объекты в этой памяти нужно создавать самому, с помощью placement-new и ручного вызова деструкторов; надеюсь, понятно почему.