Было предложено включить функцию 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++. Надеюсь, что кто-то поможет мне понять эту концепцию.