Перераспределение памяти

Каков правильный и лучший способ перераспределения памяти? например, я выделяю 100 байт с помощью функции WinAPI HeapAlloc, затем я заполняю 100 байт этой памяти некоторыми данными, и теперь я хочу добавить больше новых данных в конце предыдущего...

Что я должен делать? Сделать новое выделение с большим количеством байтов, а затем скопировать старое + новое в новое место и освободить старую память? Или есть способ выделить новую память в конце старых данных, а затем скопировать только новые данные?


person davispuh    schedule 13.06.2010    source источник
comment
в любом случае перераспределение не является бесплатным действием, поэтому вам следует ограничить количество требуемых перераспределений... если вы знаете, что вам нужно добавить N байтов после 100 байтов, выделите N+100 в начале и избегайте перераспределения; если вы знаете, что вам может понадобиться N дополнительной памяти на данные, выделите 100+N*m, где m выбирается в соответствии с вашими потребностями, чтобы ограничить вероятное количество realloc и дополнительного использования памяти одновременно...   -  person ShinTakezou    schedule 13.06.2010


Ответы (2)


Вероятно, вам следует использовать HeapReAlloc, поскольку В Windows, несомненно, будут оптимизации, если она сможет просто расширить память без копирования данных.

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

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

person paxdiablo    schedule 13.06.2010
comment
Спасибо, сейчас попробую :) - person davispuh; 13.06.2010

HeapReAlloc?

person Andreas Rejbrand    schedule 13.06.2010