簡體   English   中英

在循環中調用 malloc 后程序中斷不會改變?

[英]Program break doesnt change after calling malloc in a loop?

運行這段代碼應該會導致程序中斷增加大約malloc_counts * _SC_PAGESIZE而不是我每次都得到固定的程序中斷,這是為什么。 malloc 應該調用brksbrk ,它們本身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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM