[英]Program break doesnt change after calling malloc in a loop?
運行這段代碼應該會導致程序中斷增加大約malloc_counts * _SC_PAGESIZE
而不是我每次都得到固定的程序中斷,這是為什么。 malloc 應該調用brk
或sbrk
,它們本身sbrk
傳遞到下一頁的大小四舍五入(有一些額外的工作)。 那么發生了什么?
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
int main(){
const long malloc_counts = 10;
printf("PAGE SIZE: %ld\n", sysconf(_SC_PAGESIZE));
void* allocated_pool[malloc_counts];
for(int counter=0; counter < malloc_counts; counter++)
{
printf("program brk: %p\n",sbrk(0));
allocated_pool[counter] = malloc(127*4096);
}
}
我想當然使用優化
您的編譯器優化了對malloc
的調用,因為它們未被使用。 因為刪除了malloc
調用,所以沒有任何變化,堆也不會移動。
並且 glibc 過度分配了很多,因此該值必須足夠大才能看到它。 而默認的M_MMAP_THRESHOLD
似乎是128 * 1024 。 所以你必須選擇一個足夠大但低於 mmap 閾值的值才能看到 glibc 的差異。
禁用編譯器優化並分配很多,堆將被移動。 請嘗試以下操作:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
printf("PAGE SIZE: %ld\n", sysconf(_SC_PAGESIZE));
#define malloc_counts 20
void *allocated_pool[malloc_counts];
for(int counter = 0; counter < malloc_counts; counter++) {
printf("program brk: %p\n", sbrk(0));
allocated_pool[counter] = malloc((size_t)127 * 1024);
*(void *volatile *)&allocated_pool[counter];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.