Действительно ли STL является вектором лучшая версия перевыделения?

Вам нужно открыть консоль (option + cmd + J на Mac и Chromium), а не источник. Затем вы можете захотеть взглянуть на вкладку Sources и попытаться найти Javascript (файл или из HTML (здесь index.php), отвечающий за то, что вы хотите отлаживать. Однако для этого самого сайта кажется, что Calculate делает вызов сервера для выполнения расчета.

7
задан aJ. 27 August 2013 в 11:06
поделиться

5 ответов

Только вектор гарантированно имеет непрерывную память. Не остальные.

realloc - это функция управления памятью C. Его использование не приветствуется в коде C ++. Вот что говорит Страуструп: Почему в C ++ нет эквивалента realloc ()?

Однако realloc () гарантированно будет работать только с массивами, выделенными malloc () (и аналогичными функциями), содержащими объекты без определяемые пользователем конструкторы копирования. Также, пожалуйста, помните, что вопреки наивным ожиданиям, realloc () иногда копирует свой массив аргументов.

15
ответ дан 6 December 2019 в 05:06
поделиться

Одним из основных преимуществ std :: vector является то, что когда он перераспределяет себя из естественного роста, он выбирает размер, который в 2 раза больше текущего размера (обычно - но всегда постоянный множитель). Это означает, что push_back'ы имеют амортизированную стоимость O (1).

Realloc даст вам более точный контроль над тем, как вы распределяете память, но с большой мощью приходит большая ответственность. Если все, что вы делаете, является эквивалентом push_back, и вы перераспределяете каждый раз, когда добавляете элемент, то есть потенциально операция O (N) для каждого добавления в массив.

5
ответ дан 6 December 2019 в 05:06
поделиться

Полагаю, это всего лишь вектор.

Я не видел никого, кто предложил бы использовать realloc в C ++.

1
ответ дан 6 December 2019 в 05:06
поделиться

Непрерывная память также гарантируется realloc, так что это не причина не использовать ее.

Однако я бы Я предпочитаю использовать вектор в C ++, поскольку он находится на более высоком уровне абстракции, поэтому он облегчает написание кода.

Единственная возможная причина, по которой я могу подумать об использовании realloc (over vector) для сценария типа массива, состоит в том, что грубая скорость. Это может быть быстрее. И я подчеркиваю слово «может» - мера, не угадай!

Однако, ты должен справиться со своими собственными перераспределениями, что требует больше работы. Я предпочел бы иметь код, который работает немного медленнее (конечно, при условии, что он все еще работает достаточно быстро), если я смогу доставить его и получить оплату быстрее.

8
ответ дан 6 December 2019 в 05:06
поделиться

Набор функций C (malloc, calloc, realloc, free) является необработанными операциями с памятью. Они будут создавать / изменять / освобождать данный буфер в памяти, но память не будет иметь типа, и конструкторы не будут вызываться.

C ++ не имеет эквивалента realloc , а только безопасных типов для malloc / free с помощью new / new [] и delete / delete [] . Версии C ++ будут получать память из системы и инициализировать ее, вызывая соответствующие конструкторы. Использование delete вызовет деструкторы объектов и затем освободит память. Версии C и C ++ несовместимы, если вы получаете память с помощью malloc (даже если вы вызываете конструктор на месте в полученной памяти), вы не можете освободить ее с помощью delete / delete [] как это неопределенное поведение.

Использование realloc в C ++ может быть небезопасным, поскольку это будет побитовое копирование объектов из одной области памяти в другую. Иногда ваши объекты не будут правильно обрабатывать движения памяти (скажем, что ваш объект имеет как атрибут, так и ссылку на него, после побитового перемещения его ссылка будет указывать на старую позицию, а не на реальный атрибут). Внутри вектора всякий раз, когда требуется увеличить память, новая память приобретается с помощью new [] , а затем все объекты копируются (или копируются) на новых позициях, используя соответствующие Операции C ++ перед удалением старых элементов.

Всякий раз, когда vector увеличивается в размере (зарезервированный размер, не используется размер), он создает новую область памяти и перемещает все объекты. С другой стороны, realloc переместит блок памяти в другую позицию только в том случае, если после указателя недостаточно непрерывного пространства, чтобы просто увеличить его . Векторы не уменьшают размер. Никогда. Когда вы очищаете элементы, зарезервированная память все еще удерживается.

Наконец, в векторе уровень абстракции выше, чем в realloc даже для типов POD (которые безопасно перемещать с помощью C- как конструкции). Эквивалентом вектора будет структура, которая содержит указатель на буфер памяти, количество используемых элементов и зарезервированный (размер буфера), а также набор функций, которые имеют дело с получением большего объема памяти при необходимости и обновлением индексы с каждой операцией.

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

Наконец, в векторе уровень абстракции выше, чем в realloc даже для типов POD (которые безопасно перемещать с помощью C- как конструкции). Эквивалентом вектора будет структура, которая содержит указатель на буфер памяти, количество используемых элементов и зарезервированный (размер буфера), а также набор функций, которые имеют дело с получением большего объема памяти при необходимости и обновлением индексы с каждой операцией.

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

Наконец, в векторе уровень абстракции выше, чем в realloc даже для типов POD (которые безопасно перемещать с помощью C- как конструкции). Эквивалентом вектора будет структура, которая содержит указатель на буфер памяти, количество используемых элементов и зарезервированный (размер буфера), а также набор функций, которые имеют дело с получением большего объема памяти при необходимости и обновлением индексы с каждой операцией.

10
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

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