在单独的编译单元中调用函数会有更多开销吗?

时间:2014-06-10 08:32:34

标签: c linux assembly x86-64

我知道由于双跳,调用DSO中的函数会产生更多开销。与在同一编译单元中调用函数相比,在单独的编译单元中调用函数是否有更多的开销(假设在两种情况下都没有内联)?

2 个答案:

答案 0 :(得分:4)

一般来说,它们将是相同的,而不是内插或其他全球优化机会。但根据架构的不同,可能存在细微差别。

例如,在Linux / Unix中,问题不在于不同CU的函数之间,而是您正在调用的函数是否具有外部链接:

void foo() {}
void bar()
{ foo(); }

或者:

static void foo() {}
void bar()
{ foo(); }

如果将此代码编译为共享对象(但不编译为可执行文件!),则外部foo()可能会被另一个共享对象覆盖(例如,通过LD_LIBRARY_PRELOAD),但静态一个人不能。因此,对共享对象内部的外部函数的调用,即使是来自相同的CU,也必须使用可重定位的跳转来完成。

然而,在Windows中,没有LD_LIBRARY_PRELOAD这样的东西,所以没有这样的差异。

答案 1 :(得分:0)

我看到的唯一可能的开销是使用可变长度的跳转宏,它在跳过编译单元时可能总是具有最大长度(除非链接器对其进行优化)。