LINUX.ORG.RU

Как правильнее изменять размер массива в С++?

 , , ,


0

1

Я не знаю, как работает realloc, но мне кажется, что явно быстрее сочетания «выделить новое место требуемого размера и скопировать в него старый массив, а потом его еще и удалить». Это правда или проще сделать realloc и переприсвоить указатели?

P.S. Именно для языка С++, то есть учитывать всю философию и т. д. Или насрать?

★★★★★

Последнее исправление: cdshines (всего исправлений: 1)

Ответ на: комментарий от vzzo

А, я перепутал source-destination. Суть примера в том, что тупых перемещений недостаточно для сложных объектов?

cdshines ★★★★★
() автор топика
Ответ на: комментарий от vzzo

Копирование и перемещение — это разные операции. Конструктор копирования предназначен именно для копирования, т.е. для создания клонов объекта. И, разумеется, он не учитывает семантику объекта при перемещении. Особенно такое перемещение как в случае с realloc, с увеличением размера объекта.

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

Burbaka ★★
()
Ответ на: комментарий от Burbaka

В c++11 конструктор перемещения A::A(A&&) и отвечает за перемещение объекта. realloc его тоже не вызывает :)

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

vzzo ★★★
()
Ответ на: комментарий от vzzo

Я, слава богу, оставил мир плюсов задолго до 2011 :) Приятно наблюдать, что до них наконец дошло, что операция копирования/удаления и перемещения суть разные. Даже отдельный конструктор завели.

Однако перемещение объектов без изменения их размера , как мы видим на примере с realloc — это только частный случай, причем весьма ограниченный. Над перемещением надо еще поработать. Может тогда в плюсах появится полноценный реаллок.

Burbaka ★★
()
Последнее исправление: Burbaka (всего исправлений: 1)
Ответ на: комментарий от Burbaka

Всегда интересно, куда люди переходят с плюсов. Куда в твоем случае? //только заметил, что редактировать уже мжно с двумя звездами.

cdshines ★★★★★
() автор топика
Ответ на: комментарий от cdshines

В моем случае переход был на дотнет. Просто с ростом производительности и удешевлением железа все меньше причин начинать разрабатывать какую-то сложную логику на плюсах.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

Обычные объекты никогда не меняют свой размер (если нет каких-нибудь грязных c-style хаков вроде struct buf_s {int size; char buf[1]; };)

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

vzzo ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.