吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2089|回复: 10
收起左侧

[C&C++ 转载] C语言 快速测试最大可用内存

[复制链接]
三滑稽甲苯 发表于 2021-11-17 16:13
众所周知,C语言的 malloc 函数可以申请一段内存空间,并且只有在 free 后才会释放。那么利用这个原理,我们可以循环 malloc 直至返回值为 NULL ,从而得到当前的最大可用内存。
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    long long int bytes = 0;
    void *p = 1;
    while (p != NULL) {
        printf("%lld Bytes...\r", bytes);
        p = malloc(1);
        bytes++;
    }
    printf("%lld Bytes RAM available.\n", bytes);}

如果只是每次申请1Byte,那么测试的效率肯定低下。我们可以一次申请2^20B的内存,如果返回了NULL,则申请2^19B的内存...如此循环,则可极大地提高测试效率。
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    long long int bytes = 0;
    unsigned int payload = 1048576;
    void *p;
    while (1) {
        printf("%lld Bytes...\r", bytes);
        p = malloc(payload);
        if (p == NULL) {
            if (payload != 1) {
                payload >>= 1;
            } else {
                break;
            }
        } else {
            bytes += payload;
        }
    }
    printf("%lld Bytes RAM available.\n", bytes);
}

当然,变量本身也会占内存,所以为了精确,必须再加上变量所占用的内存。
[C] 纯文本查看 复制代码
bytes += sizeof(p) + sizeof(payload) + sizeof(bytes);

实机运行,一秒不到就得到了结果
屏幕截图 2021-11-17 161228.png

免费评分

参与人数 2吾爱币 +1 热心值 +1 收起 理由
54sb + 1 我很赞同!
Tonyha7 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

IITSUKI 发表于 2021-11-17 16:46
哇,真不错
跑得快有糖吃 发表于 2021-11-17 18:41
wihn 发表于 2021-11-17 18:54
程序一直malloc没有free,其他程序想用内存,它们不会炸么.....
xiaohe_nh 发表于 2021-11-17 19:11
这样算是不合理的。假设能够分配1024个1k的内存,但不等于能够分配1个1M的内存。
 楼主| 三滑稽甲苯 发表于 2021-11-17 19:52
wihn 发表于 2021-11-17 18:54
程序一直malloc没有free,其他程序想用内存,它们不会炸么.....

程序结束后就自动free了
codol 发表于 2021-11-17 20:38
真不错,学习了
guangzisam 发表于 2021-11-17 20:55
有使用价值
wsb168 发表于 2021-11-17 21:14
学习了,可以自己试下。
woqnmbd 发表于 2021-11-17 21:26
单个程序有没有申请内存的上线呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表