Пользовательское распределение памяти - C v. C ++ - PullRequest
1 голос
/ 07 августа 2020

Я изучал C ++ и сталкивался с темами о пользовательских распределителях памяти. Я понял, что, разработав распределитель и используя этот распределитель со стандартными библиотечными контейнерами, мы можем избежать распределения кучи. Кроме того, похоже, что мы можем избежать фрагментации памяти. Частично это достигается за счет использования операторов размещения нового и удаления размещения.

Возможна ли разработка настраиваемого распределителя памяти в C, чтобы мы могли управлять выделением памяти и избегать фрагментации? Если возможно, может ли C ++ просто предложить эту возможность с более высокими уровнями абстракции?

Ответы [ 3 ]

4 голосов
/ 07 августа 2020

Оба C и C ++ являются языками с низким уровнем магии c. C особенно выделяет мало памяти за вашей спиной. Это может быть сделано, например, для функций vararg, но почти каждая нормальная структура данных выделяется явно вами, программистом. Если вы вызываете malloc, используется куча по умолчанию. Если вы вызываете что-то еще, используется что-то еще.

1 голос
/ 07 августа 2020

Вы всегда можете написать собственный распределитель памяти и свою собственную реализацию malloc (что-то вроде new в C ++) и free (сравнимо с delete). Примером распределителя, который подчеркивает предотвращение фрагментации, является jemallo c.

C ++ предлагает распределители на более высоком уровне, более абстрактно с помощью std :: allocator

0 голосов
/ 07 августа 2020

Вы можете выделить огромный кусок памяти или объявить огромный массив, а затем использовать что-то вроде алгоритма приятеля в качестве настраиваемого распределителя. Все, что вам нужно сделать, это #define mallo c и свободно указывать на свои процедуры выделения и освобождения.

Если вы программист windows, старые программы MF C будут иметь что-то вроде

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

Это новое определение для отладочной версии, которая отслеживает утечки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...