c-在循环中调用malloc后,程序中断不会改变吗



运行这段代码应该会导致程序中断增加大约malloc_counts * _SC_PAGESIZE,而我每次都会得到固定的程序中断,那么为什么会这样呢。malloc应该调用brksbrk,后者本身会将传递给下一页的大小取整(需要一些额外的工作(。那么发生了什么?

#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
int main(){
const long malloc_counts = 10;
printf("PAGE SIZE: %ldn", sysconf(_SC_PAGESIZE));
void* allocated_pool[malloc_counts];
for(int counter=0; counter < malloc_counts; counter++)
{
printf("program brk: %pn",sbrk(0));
allocated_pool[counter] = malloc(127*4096);
}
}

我想这当然是使用优化

编译器优化了对mallocout的调用,因为它们是未使用的。因为malloc调用被删除,所以没有任何更改,堆也不会移动。

glibc过度分配了很多,所以值必须足够大才能看到它。默认的M_MMAP_THRESHOLD似乎是128*1024。因此,您必须选择一个足够大但低于mmap阈值的值,才能看到glibc中的差异。

禁用编译器优化并分配大量,堆将被移动。尝试以下操作:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
printf("PAGE SIZE: %ldn", sysconf(_SC_PAGESIZE));
#define malloc_counts  20
void *allocated_pool[malloc_counts];
for(int counter = 0; counter < malloc_counts; counter++) {
printf("program brk: %pn", sbrk(0));
allocated_pool[counter] = malloc((size_t)127 * 1024);
*(void *volatile *)&allocated_pool[counter];
}
}

最新更新