我有一个C ++代码,它有3个数组声明。
float A[NUM];
float B[NUM];
float C[NUM];
当我使用NUM=512
进行编译时,编译很快
time g++ -DNUM=512 trials trials.cpp -lm
0.16s user 0.04s system 94% cpu 0.219 total
但是,当我使用NUM=167772160
进行编译时,需要更多时间。
time g++ -DNUM=167772160 trials trials.cpp -lm
7.90s user 0.69s system 99% cpu 8.604 total
我多年没用过C ++了。我很想知道为什么编译时存在时间差,尽管编译后的目标文件大小相同。
答案 0 :(得分:10)
这是一个众所周知的难题。在某个地方,数组的实际内存将被分配
请参阅: Linker performance related to swap space?
看起来,正如我们可能怀疑的那样,看起来ld实际上是在尝试匿名mmap这个数组的整个静态内存空间(或者可能是整个程序,因为程序的其余部分是这么小,它可能都适合那个额外的4096)。
也相关:
答案 1 :(得分:0)
您的阵列是在本地还是全局声明的? 如果它是全局的,因为链接器应该在.data节中分配内存,这可能需要很长时间。 但是,如果在本地声明它,因为内存是在运行时分配的,而不是链接时。这将是链接器的问题,但是由分析器或编译器的优化器引起的问题。