在单独的编译单元中调用函数是否会产生更多开销?

Ros*_*all 5 c linux assembly x86-64

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

rod*_*igo 5

一般来说,它们是相同的,不包括内联或其他全局优化机会。但根据架构的不同,可能会有细微的差异。

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

void foo() {}
void bar()
{ foo(); }
Run Code Online (Sandbox Code Playgroud)

或者:

static void foo() {}
void bar()
{ foo(); }
Run Code Online (Sandbox Code Playgroud)

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

然而,在 Windows 中,没有 之类的东西LD_LIBRARY_PRELOAD,因此没有这样的区别。