c - -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,但它仍然说它超出了限制,我还应该改进什么?我几乎认为网站有错误或什么的......
解决方案
来自GNU GCC 手册,第 197 页:
-static 在支持动态链接的系统上,这会覆盖“-pie”并阻止与共享库的链接。在其他系统上,此选项无效。
如果您不了解pie
此处引用的标志,请查看此部分:
-pie 在支持它的目标上生成一个与位置无关的动态链接可执行文件。为了获得可预测的结果,您还必须在指定此链接器选项时指定用于编译的同一组选项(“-fpie”、“-fPIE”或模型子选项)。
回答您的问题:是的,静态标志是否可能产生这种开销,因为在这种情况下,编译器无法通过将 stdlib 的代码与您生成的代码合并来进行基本优化。
正如评论中建议的那样,您应该使用网站的相同标志编译您的代码,以了解您的程序的实际开销(确保您的 gcc 版本与网站相同),并且您应该做一些常见的手动优化,例如常量折叠、函数内联等。对这些优化的一个很好的参考可能是这个
推荐阅读
- mysql - 雪花中的 CONV() 函数
- javascript - 切换 RGB 背景颜色
- scheme - 关于 eq 的 Scheme 和 R5RS 问题
- powershell - 如何将这些 Active Directory 帐户操作记录到 CSV 文件?
- node.js - 如何将 ObjectId 传递给 POST 请求?
- dns - DNS a vs cname 记录
- unity3d - 如何让 Fiddler 或 Charles 从 Unity 2018 IL2CPP 应用程序中捕获流量
- python - 无法将变量从 admin.py 导出到 django 中的覆盖模板
- batch-file - 使用 .bat 脚本将文件移动到 jar 中
- node.js - 使用 api 在 shopify 上创建主题