我知道由于双跳,调用DSO中的函数会产生更多开销。与在同一编译单元中调用函数相比,在单独的编译单元中调用函数是否有更多的开销(假设在两种情况下都没有内联)?
答案 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)
我看到的唯一可能的开销是使用可变长度的跳转宏,它在跳过编译单元时可能总是具有最大长度(除非链接器对其进行优化)。