В моей программе я создаю 5 векторов, каждый из которых содержит 1 миллион элементов. Когда я компилирую свою программу с оптимизацией O3, она занимает около 2 ГБ во время работы. Однако, если я скомпилирую с O3-оптимизацией и сошлюсь с библиотекой tcmalloc, предоставленной google-perf, потребуется максимальный размер резидентного набора всего 1,5 ГБ. Может кто-нибудь объяснить мне, почему это происходит? Связывание с tcmalloc всегда лучше, чем связывание с glibc malloc?
tcmalloc
ориентирован на страницу, это означает, что внутренней единицей измерения обычно являются страницы, а не байты. Это облегчает уменьшение фрагментации и повышает локальность различными способами.
tcmalloc` определяет страницу как 8192 байта, что на самом деле составляет 2 страницы в большинстве систем Linux.
Куски можно рассматривать как разделенные на две категории верхнего уровня. «Маленькие» чанки меньше kMaxPages (по умолчанию 128) и далее делятся на классы размеров и удовлетворяются кешами потоков или центральными кешами классов для каждого размера. «Большие» фрагменты> = kMaxPages и всегда удовлетворяются центральным PageHeap.
больше здесь: http://jamesgolick.com/2013/5/19/how-tcmalloc-works.html