Может ли "прагма-пакет 1" быть полезным, чтобы избежать фрагментации кучи?

В моей программе я вижу увеличение размера резидента. Полагаю, это из-за фрагментации кучи. Поэтому я планирую использовать #pragma pack 1. Сможет ли это уменьшить фрагментацию кучи?

Будут ли какие-то другие накладные расходы?

Должен ли я пойти на это или нет?

Ответ 1

Структуры упаковки, вероятно, не будут иметь большого влияния на фрагментацию кучи. Разделение кучи обычно происходит, когда существует повторяющийся шаблон распределения и освобождение памяти. Здесь есть две проблемы: одна проблема заключается в том, что виртуальное адресное пространство становится фрагментированным, другая проблема заключается в том, что физические 4k-страницы заканчиваются неиспользованными пробелами, потребляя все большее количество памяти с течением времени. Microsoft решает проблему с 4k-страницей с помощью ее .net-структуры, которая иногда переупаковывает память, но делает это путем "приостановки" приложения .net во время переупаковки. Я не уверен, как серверные приложения, работающие 24 часа в сутки /7 дней в неделю, справляются с этим, не имея дело с паузами, если они иногда не отрывают новый процесс, чтобы захватить серверную сторону, а затем закрыть старый который обновит новое виртуальное адресное пространство процесса новым набором страниц.

Ответ 2

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

'pragma pack 1' не помогает избежать фрагментации кучи.

'pragma pack 1' используется для удаления байтов заполнения из структур, чтобы помочь с передачей двоичных структур между программами.

Ответ 3

Это просто, как работает операционная система. Когда вы освобождаете какую-то память, которую вы выделили, она не удаляется из карты памяти процесса. Это своего рода оптимизация из ОС в случае, если процессу необходимо снова выделить больше памяти, потому что тогда ОС не нужно добавлять новое сопоставление на карту памяти процесса.

Ответ 4

#pragma pack N, говорит компилятору выровнять элементы структуры определенным образом, с заполнением (N-1) байтами. Например, если N равно 2, каждый char будет занимать 2 байта, один назначенный, один отступ. Если N равно 1, отступ не будет. Это будет иметь больше фрагментации, так как будет нечетное количество байтов, если структура скажет один char и один int, всего 5 байтов. Проверьте: Эффект #pragma pack

Ответ 5

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

Но это вряд ли будет вашей реальной проблемой. Как еще один ответ указывает, ОС не сразу освобождает освобожденную память, и это может повлиять на кажущееся использование памяти в процессе.