gcc的链接顺序是否会影响程序的执行速度?

问题描述 投票:4回答:1

我知道gcc中的链接顺序对正确确定符号很重要,但现在我看到结果的可执行文件出现了奇怪的速度问题。我将对象和archieves链接为

g++ -m32 a.o b.o ar1.a ar2.a -lm -lpthread -lcrypt -lz -pthread -o afast.out。

g++ -m32 a.o ar1.a b.o ar2.a -lm -lpthread -lcrypt -lz -pthread -o aslow.out。

b.o其实是在ar1.a的archieve中,但ar2.o有引用,因此linker抱怨,因此我不得不把b.o放进去。一开始,我是把b.o一直放到链接的最后,以使依赖顺序正确,不过后来发现即使在开始时也可以,甚至更快。

有人有这样的经验吗?对象文件的链接顺序和archieve顺序不同吗?怎么会影响速度呢?

用gcc3.4.6或gcc4.1.2都有类似的结果。

performance gcc linker g++ ld
1个回答
4
投票

在那里 可以 根据对象代码在内存中的布局,执行速度会有显著的差异。一般来说,你希望热函数靠得很近,这样它们就不会和冷函数混在一起,这样你的 IcacheTLB 是不会被冷功能污染的。然而,您受此影响的可能性很小。

最有可能的是,你有一些符号在 "快速 "可执行文件中以一种方式解决,而在 "慢速 "可执行文件中以另一种方式解决。归档库和对象文件在命令行中的顺序。事务,你可能最终会把一些对象从 ar1.a 中的 "快速 "链接,而你将从 "快速 "链接中提取一个同等的对象。ar2.a 在 "慢 "的环节中。可能是有一些未优化的代码,在 ar2.a ?

奔跑 nm -A ar1.a ar2.a 并检查是否有任何符号出现在这两者中,这将是第一步。然后你可以要求链接器生成一个链接图(用 -Wl,-M,map.out),并在两个链接中检查这些符号到底来自哪里。

© www.soinside.com 2019 - 2024. All rights reserved.