【问题标题】:GCC: avoiding long time linking while using static arraysGCC:使用静态数组时避免长时间链接
【发布时间】:2013-06-13 08:20:32
【问题描述】:

我的问题实际上是重复this one,它询问为什么会出现这个问题。我想知道是否可以避免它。

问题是:如果我静态分配大量内存:

unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];

然后链接器 (ld) 需要很长时间才能生成可执行文件。 @davidg 对我上面给出的这种行为有一个很好的解释:

这给我们留下了以下一系列步骤:

  1. 汇编器告诉链接器它需要创建一段 1GB 长的内存。

  2. 链接器继续分配内存,准备将其放入最终的可执行文件中。

  3. 链接器意识到此内存位于 .bss 部分并标记为 NOBITS,这意味着数据只是 0,不需要物理放置到最终的可执行文件中。它避免写出 1GB 的数据,而只是丢弃分配的内存。

  4. 链接器将编译后的代码写入最终的 ELF 文件,生成一个小的可执行文件。

更智能的链接器可能能够避免上面的第 2 步和第 3 步,从而使您的编译时间更快

好的。 @davidg 解释了为什么链接器需要很多时间,但我想知道如何避免它。也许 GCC 有一些选项,比如链接到 be a little smarteravoid steps 2 and 3 above

谢谢。

附:我在 Ubuntu 上使用 GCC 4.5.2

【问题讨论】:

  • 尝试使用静态全局变量。
  • 我稍微澄清了你的问题和标题,所以读者不必直接阅读最后一段就可以了解问题是什么,或者为什么它不是重复的。希望你不要介意。 :)
  • @Claudio 我确实使用了静态全局变量。
  • @jalf 非常好的变化。非常感谢。
  • 你能避免使用静态全局吗? :) malloc 不是一个选项?

标签: gcc


【解决方案1】:

您只能在发布版本中分配静态内存:

#ifndef _DEBUG
    unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
#else
    unsigned char *static_data;
#endif

【讨论】:

  • 嗯。好主意,但我大大简化了我的代码。实际上static_data是这样定义的MyStruct static_data[ ONE_DIMENTION ][ TWO_DIMENTION ][ THREE_DIMENTION ];Shurely,我可以像MyStruct ***static_data一样声明它并在循环中分配所有维度,但是我懒得这样做)))
  • 为该数据使用单独的编译单元也应该会增加编译时间,对吧?我的意思是如果你把结构放在一个c文件中并单独编译它?
  • 不。我有一个巨大的链接时间。不编译。是的……这个结构位于单独的 cpp 文件中。
【解决方案2】:

我会想到 2 个可以提供帮助的想法:

  1. 正如一些评论中已经提到的:将它放在一个单独的编译单元中。这本身不会减少链接时间。但也许与增量链接一起使用会有所帮助(ld 选项 -r)。
  2. 其他类似。将它放在一个单独的编译单元中,并从中生成一个共享库。稍后再与共享库链接。

遗憾的是,我不能保证其中之一会有所帮助,因为我无法测试:我的 gcc(4.7.2) 和 bin 工具没有显示这种耗时的行为,8、16 或 32 GB 的测试程序编译和链接不到一秒钟。

【讨论】:

  • 当我尝试将 -r 选项添加到链接器时,我遇到了类似的问题 - lists.gnu.org/archive/html/help-gplusplus/2007-01/msg00058.html 我可以看到这是老问题((
  • @borisbn:啊,你使用 C++,据我记得你不应该单独使用 -r,而是 -Ur,不知道它在这个错误情况下是否有帮助。所以我会把钱投入到共享库方法中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2021-04-25
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多