一、背景
最近讀《程序員的自我修養(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é)問題可要一探究竟哦!