我的问题实际上是重复这一个,它要求为什么这个问题会发生.我想知道是否有可能避免它.
问题是:如果我静态分配大量内存:
unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
Run Code Online (Sandbox Code Playgroud)
然后linker(ld)需要很长时间才能生成可执行文件.@davidg对我上面提到的这个问题有一个很好的解释:
这给我们留下了以下一系列步骤:
汇编器告诉链接器它需要创建一个1GB长的内存段.
链接器继续并分配此内存,以准备将其放入最终的可执行文件中.
链接器意识到此内存位于.bss部分并标记为NOBITS,这意味着数据只是0,并且不需要物理放入最终的可执行文件中.它避免写出1GB的数据,而只是抛弃分配的内存.
链接器只向编译的代码写入最终的ELF文件,生成一个小的可执行文件.
更智能的链接器可能能够避免上面的步骤2和3,从而使编译时间更快
好.@davidg解释了为什么链接器需要花费很多时间,但我想知道如何避免它.也许GCC有一些选择,会对链接器说到be a little smarter和avoid steps 2 and 3 above?
谢谢.
PS我在Ubuntu使用GCC 4.5.2
您只能在发布版本中分配静态内存:
#ifndef _DEBUG
unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ];
#else
unsigned char *static_data;
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
348 次 |
| 最近记录: |