gpt4 book ai didi

c - 为什么这个程序的内存占用没有增加?

转载 作者:太空狗 更新时间:2023-10-29 17:23:51 26 4
gpt4 key购买 nike

我在一个 scratchbox 交叉编译环境中并且有这个

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

int main()
{
int * ptr;
int i=0;

while(1)
{
ptr = (int*)malloc( 10485760 * sizeof(int) );

if(ptr == NULL)
{
printf("Could not malloc\n");
exit(1);
}

else
{
printf("Malloc done\n");
for (i = 0 ; i <= 10485759 ; i++)
{
ptr[i] = i ;
}
sleep (5);
continue;
}
}
}

当我运行二进制文件并执行

ps -p pid -o cmd,rss,%mem

我没有看到进程的内存占用有任何增加。这是为什么?

最佳答案

您可能构建得非常优化。

在大多数现代系统上,gcc 知道 malloc 返回一个非别名指针。也就是说,它永远不会返回同一个指针两次,也永远不会返回您在其他地方“实时”保存的指针。

我觉得这很难想象,但有可能 malloc 被调用一次,它的返回值被一遍又一遍地使用。原因是:

它知道你的内存是一个死库。即:你写给它,但它永远不会被读取。已知该指针没有别名,因此它没有转义以从其他地方读取,也没有标记为 volatile 。你的 for 循环本身/可能/被丢弃。

那时它可以一遍又一遍地使用相同的内存。

这就是我难以置信的原因:gcc 对 malloc 了解多少? Malloc 可能会产生任何类型的副作用,例如增加全局“调用次数”以“将我的房间涂成随机的蓝色阴影”。它会挂断电话并假设它没有副作用,这似乎真的很奇怪。该死,“malloc”可以实现为每 100 次调用返回 NULL(可能不完全符合规范,但谁说了算)。

它没有做的是代表您释放它。这超出了它“可能”知道的范围,并进入了“做它不允许做的事情”的领域。你被允许泄漏内存,尽管它可能很蹩脚。

两件事在这里很有用:1) 编译环境:操作系统、编译器和命令行标志。

和 2) 最终二进制文件的反汇编。 (objdump 或来自编译器)

关于c - 为什么这个程序的内存占用没有增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10746759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com