Динамический массив: Double Size Realloc vs Big Reserve + Commit [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Динамический массив: Double Size Realloc vs Big Reserve + Commit [закрыто]

Сообщение Anonymous »

Существует по сути два подхода к динамическим массивам. Одним из них является Malloc -inment prick и realloc -ing с вдвое большей емкостью по мере роста массива. В какой -то момент realloc начнет выделять новый массив и копировать содержимое старого и освободить старое. Это, безусловно, самый распространенный подход, но по мере того, как массив становится очень большим, перераспределение и копия могут ввести значительную задержку.
С другой стороны, можно инициализировать массив, оставив огромное количество виртуального адресного пространства (с виртуальным , MMAP , и т. Д. В зависимости от платформы) даже на все размеры. Затем по мере роста размера массива можно просто совершить память на лету. Это не только избегает копирования, но и любые указатели на массив также не будут недействительными. Однако я не видел, чтобы это использовалось в дикой природе ... < /p>
Итак, мой вопрос в том, почему? Почему первый подход почти всегда используется, а второй - так редко? У меня не хватает значительных недостатков второго подхода? Или я даже недооцениваю частоту использования второго подхода в дикой природе? /> [*] Особые функции в этом комментарии были приведены в качестве примера, вопрос о двух подходах (резерв + Commit vs Allocate + Copy), тот факт, что большой Malloc не будет совершать, если память не затрачена на многих системах, не имеет значения. Конечно, выбрать границу, чтобы быть целым физическим размером оперативной памяти или более для многих крошечных массивов, которые будут только получить лишь немного элементов, все еще может исчерпывать адресное пространство, но легко избежать этого, выбрав разумные границы (и используя вообще различный подход для небольших массивов, потому что, например, если они меньше, чем одна страница, память). копирование, вместо того, чтобы повторять память, но это реалистичное предположение:
https://github.com/llvm/llvm-project/bl ... /realloc.h
https://github.com/llvm/llvm-project/bl ... ist_heap.h



Подробнее здесь: https://stackoverflow.com/questions/797 ... rve-commit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»