Это вопрос системы Linux, а не вопрос кодирования. Когда я использую «верх» для проверки использования моей программы в памяти, она сообщает значение в 3-4 раза больше, чем фактическое распределение кучи, заданное Valgrind's Massif, профилировщиком памяти. Это большая программа, и разница составляет сотни мегабайт. Руководство Valgrind дает лишь частичное объяснение:Сколько памяти Linux дал malloc()?
(массив) не непосредственно измерения памяти, выделенной с системы более низкого уровня вызовов, как ттар, mremap и БРК.
Функции распределения кучи, такие как malloc, построены поверх этих системных вызовов . Например, при необходимости распределитель обычно будет вызывать mmap для выделения большого фрагмента памяти, а затем передать фрагментов этого фрагмента памяти в клиентскую программу в ответ на вызовы в malloc et al. Massif напрямую измеряет только эти вызовы более высокого уровня malloc и др., А не системные вызовы более низкого уровня.
Хорошо, но сколько памяти я действительно забираю из системы? Мне нужно иметь возможность запускать как можно больше экземпляров этой программы на одной машине, поэтому мне нужно знать, какая часть этой памяти по-прежнему доступна. Выравнивание страниц и т. Д. Не может объяснить разницу в сотнях мегабайт в используемой памяти.
Кроме того, что определяет размер блока лежащего в основе вызова mmap()? Я вижу блоки с 64 МБ в то время, когда их берут по вершине, которые кажутся странно большими.
Существует различие между распределением виртуальной памяти и использованием физической памяти. В верхней части Linux они отображаются как VIRT и RES. Используйте 'pmap -X [pid]' для большого количества деталей памяти. Я сомневаюсь, что эти 64-мегабайтные блоки памяти фактически используются. Вероятно, это виртуальные оговорки. –
Стоит отметить, что всякий раз, когда вы запускаете программу под valgrind или asan, она выделяет много памяти в детском пространстве для своих собственных структур. – o11c