我怎样才能编译这个非常大但无聊的C源代码?

时间:2015-11-19 22:07:12

标签: c compilation compiler-optimization compiler-flags

我的代码中的中心函数看起来像这样(其他一切都是vanilla输入和输出):

-O0

为了这个问题的目的,假设对这些40000行(或非常相似)进行硬编码是非常必要的。所有这些行只包含具有固定数字和-O0条目的基本算术运算(平均每行40个);没有调用任何函数。源的总大小为14MB。

尝试编译此代码时,编译器会面临大量内存使用。我可以让Clang用-O1编译它(只需要20秒),但我没有使用GCC(即使是y[0])或y[1]

虽然在代码端或全局范围内(即通过以另一种顺序计算各个行)几乎没有可以优化的东西,但我相信编译器会找到一些在本地范围内优化的东西(例如,计算计算{{1}}和{{1}})所需的括号内的术语。

我的问题是:

  • 是否有一些编译器标志仅激活不需要额外内存的优化?
  • 还有其他一些方法可以让编译器更好地处理这个源(不会失去比通过优化获得的更快的速度)吗?

3 个答案:

答案 0 :(得分:1)

Lee Daniel Crocker的

The following comment解决了这个问题:

  

我怀疑你遇到的限制是单个堆栈帧/块/功能所需的结构大小。尝试将其分解为100个100行的功能,看看它是否更好。

当使用每行100行的函数(并连续调用所有函数)时,我获得了一个程序,我可以使用-O2编译而没有任何问题。

答案 1 :(得分:0)

您可以add swap space尽可能多地让编译器在启用优化的情况下编译代码。使用这种技术,编译过程将变得更慢。但是,编译器可用的内存量仅受虚拟地址空间大小的限制。另一个不太方便的选择是安装更多RAM。还要确保运行编译器的进程对其可以分配的内存量没有限制。关于编译器标志,我不认为有标志可以用来直接控制编译器的内存使用情况,让编译器将自己调整到指定的限制。

答案 2 :(得分:-1)

将它写在汇编中。

我假设您有一个生成此C文件的工具。为什么不吐出汇编代码?