В моей программе я вижу некоторое увеличение размера резидента. Я полагаю, это из-за фрагментации кучи.
Поэтому я планирую использовать #pragma pack 1
,
Это уменьшит фрагментацию кучи?
Это будет иметь некоторые другие накладные расходы?
Должен ли я пойти на это или нет?
Структуры упаковки, вероятно, не будут иметь большого влияния на фрагментацию кучи. Фрагментация кучи обычно происходит, когда существует повторяющаяся схема выделения и освобождения памяти. Здесь есть две проблемы: одна проблема заключается в том, что виртуальное адресное пространство фрагментируется, другая проблема заключается в том, что физические страницы размером 4 Кбайт заканчиваются неиспользованными пробелами, которые со временем занимают все больше памяти. Microsoft решает проблему страниц 4k с помощью своей среды .net, которая иногда перепаковывает память, но делает это, «останавливая» приложение .net во время перепаковки. Я не уверен, как серверные приложения, которые работают 24 часа в сутки / 7 дней в неделю, справляются с этим, не имея дело с паузами, если они иногда не запускают новый процесс, чтобы захватить серверную часть, а затем закрывают старый процесс, который обновит виртуальное адресное пространство нового процесса новым набором страниц.
Существует хорошо зарекомендовавшая себя методика Пулы памяти. Он разработан специально для уменьшения фрагментации памяти и устранения утечек памяти. И это следует использовать в случае, когда фрагментация памяти стала узким местом в функциональности программы.
«Pragma Pack 1» не помогает избежать фрагментации кучи.
‘Pragma Pack 1’ используется для удаления байтов заполнения из структур, чтобы помочь с передачей двоичных структур между программами.
Это просто, как работает операционная система. Когда вы освобождаете часть памяти, которую вы выделили, это не не нанесенный на карту из карты памяти процесса. Это своего рода оптимизация ОС в случае, если процессу необходимо снова выделить больше памяти, потому что тогда ОС не нужно добавлять новое отображение в карту памяти процесса.
#pragma pack N
, указывает компилятору выравнивать элементы структуры определенным образом, с заполнением (N-1) байтов. Например, если N равно 2, каждый символ будет занимать 2 байта, один назначенный, один заполнитель. Если N равно 1, заполнение не будет. Это будет иметь больше фрагментации, так как было бы нечетное количество байтов, если структура имеет, скажем, один символ и одно целое, всего 5 байтов.
Проверьте: #pragma pack effect
Если вас особенно беспокоит фрагментация кучи, возможно, вы захотите увеличение структура упаковки. Это (иногда) приводит к тому, что различные структуры распределяются между меньшим количеством сегментов разных размеров и уменьшают вероятность распределения, оставляя непригодные промежутки, когда они занимают пространство ранее освобожденной, немного большей структуры.
Но это вряд ли будет вашей реальной заботой. Как указывает другой ответ, ОС не сразу восстанавливает освобожденную память, и это может повлиять на видимое использование памяти процессом.