如何用-static编译命令有如此大的内存差异?(C)

问题描述 投票:0回答:1

我正在为大学工作,有一个网站可以检查我的内存使用情况,它会编译.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千字节,应该是1,6 Mibs。那么对于大学检查员来说,我的计划如何超过4个Mibs呢?我已经消除了我所拥有的所有可能的mallocs,我只是留下了必要的,但它仍然说它超过了限制,我还应该改进什么?我几乎以为wesite有错误或什么......

c gcc memory-management
1个回答
1
投票

来自GNU GCC Manual,第197页:

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.