GCC:使用静态数组时避免长时间链接

GCC:使用静态数组时避免长时间链接,gcc,Gcc,我的问题实际上是重复的,它问为什么会发生这个问题。我想知道是否有可能避免它 问题是:如果静态分配大量内存: unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ]; 然后链接器(ld)需要很长时间才能生成可执行文件。@davidg对我上面提到的这种行为有一个很好的解释: 这就给我们留下了以下一系列步骤: 汇编程序告诉链接器它需要创建一段1GB长的内存 链接器继续分配内存,准备将其放入最终的可执行文件中 链接器意识到该内存位于.bss节中,并被标

我的问题实际上是重复的,它问为什么会发生这个问题。我想知道是否有可能避免它

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

unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
然后链接器(
ld
)需要很长时间才能生成可执行文件。@davidg对我上面提到的这种行为有一个很好的解释:

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

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

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

  • 链接器意识到该内存位于.bss节中,并被标记为NOBITS,这意味着数据仅为0,不需要物理地放入最终的可执行文件中。它避免了写出1GB的数据,而只是扔掉分配的内存

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

  • 一个更智能的链接器可能能够避免上面的步骤2和步骤3,从而使编译速度更快

    嗯@davidg已经解释了为什么linker需要花费很多时间,但是我想知道如何避免它。也许GCC有一些选择,那就是让链接器
    更聪明一点
    ,并且
    避免上面的步骤2和步骤3

    多谢各位


    注意:我在Ubuntu上使用GCC4.5.2,您只能在发布版本中分配静态内存:

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

    我有两个想法可以帮助你:

  • 正如一些评论中已经提到的:将它放在一个单独的编译单元中。这本身不会减少链接时间。但可能与增量链接一起使用会有所帮助(ld option
    -r
  • 另一个是类似的。将它放在一个单独的编译单元中,并从中生成一个共享库。稍后只需与共享库链接即可
    遗憾的是,我不能保证其中一个会有帮助,因为我没有办法进行测试:我的gcc(4.7.2)和bin工具不会显示这种耗时的行为,8、16或32 GB的测试程序会在一秒钟内编译并链接。

    尝试使用静态全局变量。我稍微澄清了您的问题和标题,因此,读者不必一直读到最后一段来了解问题是什么,或者为什么它不是重复的。希望你不介意。:)@克劳迪奥我确实使用了一个静态全局变量。@jalf非常好的变化。非常感谢。那么您能避免使用静态全局吗?:)malloc不是一个选项?嗯。好主意,但我大大简化了我的代码。实际上,
    static\u data
    是这样定义的
    MyStruct static\u data[一维][二维][三维]
    Shurly,我可以像
    MyStruct***static\u data
    那样声明它,并在循环中分配所有维度,但我懒得这样做)))为这些数据使用单独的编译单元也会增加编译时间,对吗?我的意思是,如果你把结构放在一个c文件中,然后单独编译它,那就不需要了。我有一个巨大的链接时间。不是编译。是的。。。这个结构存在于单独的cpp文件中。当我尝试向链接器添加
    -r
    选项时,我遇到了与此类似的问题-正如我所看到的,这是一个老问题((博利斯邦:啊,你用C++,就我所记得的,你不应该单独使用-R,而是代替<代码> Ur < /Cord>,不知道它是否有助于这个错误的例子。所以我会把我的钱投入共享的LIB方法。