【问题标题】:How to optimize the executable generated by a C compilation in Linux terminal如何在 Linux 终端优化 C 编译生成的可执行文件
【发布时间】:2015-11-20 17:02:07
【问题描述】:

有没有办法减少使用gcc source_file.c -o result 之类的命令生成的可执行文件使用的内存?我浏览了互联网,还查看了“gcc”的手册页,我认为我应该使用与-c-S 相关的内容。那么gcc -c -S source_file.c -o result 工作吗? (这似乎减少了使用的空间......还有其他方法可以减少更多吗?)

谢谢, 波尔布

【问题讨论】:

  • 您可能想再次阅读 gcc 文档。你真的在问-Os吗?
  • 我建议您在代码编写结束时使用优化进行编译,因为如果您需要调试程序,在编译时,CPU 将重新排序指令以避免它们之间的依赖,并且您将无法跟踪该进程的运行。
  • ".. the memory used .." - 您似乎在询问可执行文件的大小only,即它占用的磁盘空间。没有编译器(目前)足够聪明,可以改变程序本身获取使用的内存。其中的malloc(LARGE_NUMBER) 将始终尝试分配LARGE_NUMBER 字节。

标签: c gcc optimization


【解决方案1】:

在类 POSIX 系统上指示编译器优化的 standard compiler option-Ooptimize 的大写字母 O)。许多编译器允许您在-O 之后选择指定优化级别。常见的优化级别包括:

  • -O0 根本没有优化
  • -O1 速度基本优化
  • -O2 全部 -O1 以及一些高级优化
  • -O3 所有 -O2 加上通常不需要的昂贵优化
  • -Os 优化大小而不是速度(gcc,clang)
  • -Oz 进一步优化大小(clang)
  • -Og 全部 -O2 除了阻碍调试的优化 (gcc)
  • -Ofast 全部 -O3 以及一些不符合标准 C 的数值优化。谨慎使用。 (gcc)

【讨论】:

  • 有趣。我从 gcc 知道这一点,但不知道这实际上是 POSIX。对此信息 +1 (如果这是错误的,请与你打赌;-)。
  • @Olaf 我添加了指向相应 POSIX 页面的链接,仅供您参考。
  • @Olaf 在language-lawyer 土地上,您永远无法知道某人是在开玩笑还是认真的。
  • 嗯,我认为这就是表情符号的用途 :-) 但你是对的;幽默不是人类的普遍属性——太糟糕了。
【解决方案2】:

选项 -S 生成汇编器输出。 更好的选择是使用 llvm 并为多架构生成汇编程序。类似http://kripken.github.io/llvm.js/demo.html

llc

这里是示例https://idea.popcount.org/2013-07-24-ir-is-better-than-assembly/

【讨论】:

  • LLVM 不生成多架构汇编程序。 LLVM 在前端之后和生成汇编程序之前使用 LLVM IR 作为中间语言。 LLVM IR 并未被设计为一种可存储和分发的格式。虽然 IR 是独立于平台的,但像 Clang 这样的前端通常不能生成独立于平台的 LLVM IR。另外,这对回答作者的问题有什么帮助?
  • 或者使用jit机器,gcc有jit
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2017-06-11
  • 2023-01-26
  • 2017-02-06
  • 2022-10-14
相关资源
最近更新 更多