我正在为大学工作,有一个网站检查我的内存使用情况,并使用以下命令编译.c文件:
/usr/bin/gcc -DEVAL -std=c11 -O2 -pipe -static -s -o program programname.c -lm
它说我的程序超出了4 Mib的内存限制,我认为这很多。有人告诉我,此命令使其使用的内存比我在PC上使用的标准编译更多,例如:
gcc myprog.c -o myprog
我使用以下命令启动了由该编译创建的可执行文件:
/usr/bin/time -v ./myprog
,在“最大居民集大小”下,该数字表示1708千字节,应为1.6兆字节。那么,对于大学检查员来说,我的程序怎么会超过4个Mib?我已经消除了我拥有的所有可能的malloc,我只保留了必要的malloc,但是它仍然说它超出了限制,我还应该改进什么?我几乎在想wesite有错误或其他问题...
答案 0 :(得分:1)
来自GNU GCC Manual,第197页:
-static在支持动态链接的系统上,它会覆盖“ -pie”并阻止与共享库的链接。在其他系统上, 选项无效。
如果您不知道此处引用的pie
标志,请查看此部分:
-pie在支持它的目标上生成一个动态链接的位置独立可执行文件。为了获得可预期的结果,您还必须 指定用于编译的相同选项集(“ -fpie”, 如果指定了此链接器选项,则为“ -fPIE”或模型子选项。
回答您的问题:是的,可能是由静态标志产生的开销,因为在那种情况下,编译器无法通过将stdlib的代码与您生成的代码合并来进行基本优化。
正如注释中所建议的那样,您应该使用与网站相同的标记来编译代码,以了解程序的实际开销(请确保您的gcc版本与网站相同),并且您也应该应进行一些常见的手动优化,例如常量折叠,函数内联等。this one