Функция размерного освобождения памяти в управлении памятью в C++1y

Было предложено включить функцию Sized Deallocation в C++1y. Однако я хотел понять, как это повлияет/улучшит текущее управление памятью низкого уровня c++?

Это предложение находится в N3778, в котором говорится о намерении этого.

В C++11 программисты могут определить оператор удаления статической функции-члена, который принимает параметр размера, указывающий размер удаляемого объекта. Эквивалентный глобальный оператор удаления недоступен. Это упущение имеет неприятные последствия для производительности.

Современные распределители памяти часто распределяют по категориям размера и из соображений экономии места не сохраняют размер объекта рядом с объектом. Затем для освобождения места требуется найти хранилище категорий размеров, содержащее объект. Этот поиск может быть дорогостоящим, особенно потому, что структуры данных поиска часто не находятся в кэшах памяти. Решение состоит в том, чтобы разрешить реализациям и программистам определять размерные версии глобального оператора delete. Компилятор должен вызывать версию с размером, а не версию без размера, когда доступна версия с размером.

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

T* p = new T();
// Now size information would be stored in the header
// *(char*)(p - 0x4) = size;
// This would be used when we delete the memory????.
delete p;

Если информация о размере хранится в заголовке, почему освобождение требует ее поиска? Похоже, я упускаю что-то очевидное и не совсем понимаю эту концепцию.

Кроме того, как эту функцию можно использовать в программе при работе с низкоуровневым управлением памятью в C++. Надеюсь, что кто-то поможет мне понять эту концепцию.


person Mantosh Kumar    schedule 13.04.2014    source источник
comment
и из соображений экономии места не храните размер объекта рядом с объектом. Они говорят о других стратегиях распределения.   -  person dyp    schedule 13.04.2014


Ответы (1)


Как в вашей цитате:

[Современные распределители памяти] из соображений экономии места не сохраняют размер объекта рядом с объектом.

Увеличение размера каждого распределения для добавления явной информации о размере, очевидно, будет использовать больше памяти, чем альтернативы, такие как сохранение информации о размере один раз для каждого пула распределения или предоставление информации при освобождении.

person Mankarse    schedule 13.04.2014