使用malloc测试堆的最大申请数量

news/2024/5/20 9:35:33 标签: malloc, , 内存空间分配

一、背景

最近读《程序员的自我修养——链接、装载和库》(俞甲子等著)一书时,看到书中一个很有意思的例子:的最大申请数量(原书P168,6.4.3),原来从来没有考虑过这个问题,在此处记录学习一下。

二、问题引入

Linux下虚拟地址空间分配给进程的是3GB,Windows默认是2GB(操作系统为32位),然而程序真正能够使用到的有多少则要根据机器而异了。我们在编程的时候经常会使用到malloc()函数申请地址空间,但malloc()最大可以申请到多少内存也并不清楚。

三、问题解决

那么,问题来了,你能写个小程序来回答上述问题么?

#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)测试的结果:

-> % ./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.

四、结论和总结

可见,大概有1.2G左右空间可用,且每次执行程序时结果都会稍有不同。那么malloc()的最大申请数量会受到哪些因素的影响呢?

其实,操作系统版本、程序本身大小、乃至的动态/共享库数量和大小、程序栈数量和大小等都会对其造成影响,甚至有些操作系统使用了一种叫做随机地址空间分布的技术(主要是出于安全考虑,防止程序受恶意攻击),使得进程的空间变小。

有兴趣的朋友不妨在自己电脑上试一下,引申出来的细节问题可要一探究竟哦!


http://www.niftyadmin.cn/n/1630555.html

相关文章

Vue使用中常见问题

1、安装sass时报未找到 1、原因应该同时安装&#xff1a;1、npm install --save-dev sass-loader 2、npm install --save-dev node-sass 2、如果用npm install时报错那就换成cnpm install 2、引入vue-chart.js插件 1、npm install vue-chartjs -S 2、npm install chart.js …

数组分配内存过大导致SIGSEGV信号(段错误)

一、背景 今天codding的时候&#xff0c;发现一个段错误。 -> % ./a.out 9000000 the size is: 0x895440 [2] 10558 segmentation fault (core dumped) ./a.out 9000000 打印跟了一下程序&#xff0c;段错误发生在定义数组的时候&#xff0c;感觉程序没毛病&#xff…

算法目录

语 言&#xff1a; 【排序】【数组】 【字符串】 【位运算】 【递归】 //学完一门语言就可以做 数 学&#xff1a; 【数学】【脑筋急转弯】 //不需要计算机专业 数据结构&#xff1a; 【链表】【…

解决777属性检测不通过

文件或文件出现解决777属性检测不通过&#xff0c;需要通过ftp解决 1.ftp连接服务器 2.选中文件夹右键修改属性 3.都勾选&#xff0c;或者把xxx换成777&#xff0c;然后递归子目录 即可 转载于:https://www.cnblogs.com/zhangyouwu/p/7452169.html

RFID、NFC、ETC技术浅析

一、一番对话引起的思考 今天和同事坐地铁去森林公园&#xff0c;进地铁的时候&#xff0c;见他拿着个手机就直接刷了。我不解&#xff0c;随口问了一句&#xff1a; 你把地铁卡放在手机里面不怕消磁了啊&#xff1f; 同事用极其鄙视的眼光看着我&#xff1a;“我用的是手机卡…

ACM Tempter of the Bone

小狗在古老的迷宫(maze)中发现了一个骨头&#xff0c;这使它非常着迷。然而&#xff0c;当他把它捡起来的时候&#xff0c;迷宫开始摇晃&#xff0c;狗狗可以感觉到地面下沉&#xff08;sinking&#xff09;。他意识到这块骨头是一个陷阱&#xff08;trap&#xff09;&#xff…

Django框架——读取数据库数据返回至前端页面

文章目录 法一&#xff1a;后端读取直接返回至前端页面法二&#xff1a;利用Vue发起ajax请求读取数据返回至data中 法一&#xff1a;后端读取直接返回至前端页面 第一种方法是输入网址&#xff0c;进入后到对应的视图&#xff0c;然后视图里面读取数据库内容&#xff0c;带着数…

OpenCV图像处理目录

主要是学习通过Python使用OpenCV进行图像处理。重点在于学习如何使用函数进行图像处理。函数是如何实现的&#xff0c;不讨论。 opencv的安装 一、图像基础处理 1.1 图像基础知识 数字图像介绍 图像属性&#xff1a;图像格式、尺寸/形状、分辨率、通道数、颜色空间 1.2…