使用malloc測試堆的最大申請數(shù)量

一、背景

最近讀《程序員的自我修養(yǎng)——鏈接、裝載和庫》(俞甲子等著)一書時,看到書中一個很有意思的例子:堆的最大申請數(shù)量(原書P168,6.4.3),原來從來沒有考慮過這個問題,在此處記錄學習一下。

二、問題引入

Linux下虛擬地址空間分配給進程的是3GB,Windows默認是2GB(操作系統(tǒng)為32位),然而程序真正能夠使用到的有多少則要根據(jù)機器而異了。我們在編程的時候經(jīng)常會使用到malloc()函數(shù)申請地址空間,但malloc()最大可以申請到多少內(nèi)存也并不清楚。

三、問題解決

那么,問題來了,你能寫個小程序來回答上述問題么?

#include <stdio.h>
#include <stdlib.h>

unsigned int maximum = 0;

int main(void)
{
    unsigned blocksize[] = {1024 * 1024, 1024, 1};
    void *block;
    int i, count;

    for(i = 0; i < 3; i++) {
        for(count = 1; ; count++) {
            block = malloc(maximum + blocksize[i] * count);
            if (block) {
                maximum = maximum + blocksize[i] * count;
                free(block);
            } else {
                break;
            }
        }
    }

    printf("maximum malloc size = %u bytes.\n", maximum);
}

下面是我在自己的機器上(VMware中的Ubuntu)測試的結(jié)果:

-> % ./a.out 
maximum malloc size = 1295646688 bytes.
-> % ./a.out 
maximum malloc size = 1281228531 bytes.
-> % ./a.out
maximum malloc size = 1280977131 bytes.
-> % ./a.out
maximum malloc size = 1281183027 bytes.
-> % ./a.out
maximum malloc size = 1281179347 bytes.

四、結(jié)論和總結(jié)

可見,大概有1.2G左右空間可用,且每次執(zhí)行程序時結(jié)果都會稍有不同。那么malloc()的最大申請數(shù)量會受到哪些因素的影響呢?

其實,操作系統(tǒng)版本、程序本身大小、乃至的動態(tài)/共享庫數(shù)量和大小、程序棧數(shù)量和大小等都會對其造成影響,甚至有些操作系統(tǒng)使用了一種叫做隨機地址空間分布的技術(shù)(主要是出于安全考慮,防止程序受惡意攻擊),使得進程的堆空間變小。

有興趣的朋友不妨在自己電腦上試一下,引申出來的細節(jié)問題可要一探究竟哦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容