首页 > 解决方案 > -static 编译命令怎么会有这么大的内存差异?(C)

问题描述

我正在为大学做一项任务,有一个网站可以检查我的内存使用情况,它会编译 .c 文件:

 /usr/bin/gcc -DEVAL -std=c11 -O2 -pipe -static -s -o program programname.c -lm

它说我的程序超出了 4 Mib 的内存限制,我认为这是很多。有人告诉我,这个命令使它比我在我的电脑上使用的标准编译使用更多的内存,如下所示:

 gcc myprog.c -o myprog

我启动了由这一编译创建的可执行文件:

/usr/bin/time -v ./myprog

在“最大驻留集大小”下,它显示 1708 KB,应该是 1,6 Mibs。那么对于大学检查员来说,我的程序怎么会超过 4 个 Mib?我已经消除了所有可能的 malloc,我只留下了必要的 malloc,但它仍然说它超出了限制,我还应该改进什么?我几乎认为网站有错误或什么的......

标签: cgccmemory-management

解决方案


来自GNU GCC 手册,第 197 页:

-static 在支持动态链接的系统上,这会覆盖“-pie”并阻止与共享库的链接。在其他系统上,此选项无效。

如果您不了解pie此处引用的标志,请查看此部分:

-pie 在支持它的目标上生成一个与位置无关的动态链接可执行文件。为了获得可预测的结果,您还必须在指定此链接器选项时指定用于编译的同一组选项(“-fpie”、“-fPIE”或模型子选项)。

回答您的问题:是的,静态标志是否可能产生这种开销,因为在这种情况下,编译器无法通过将 stdlib 的代码与您生成的代码合并来进行基本优化。

正如评论中建议的那样,您应该使用网站的相同标志编译您的代码,以了解您的程序的实际开销(确保您的 gcc 版本与网站相同),并且您应该做一些常见的手动优化,例如常量折叠、函数内联等。对这些优化的一个很好的参考可能是这个


推荐阅读