2014-06-10 17 views

回答

4

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

例如,在的Linux/Unix,这个问题是不是不同的CU的功能之间,但你调用的函数是否有外部链接,或不:

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

或者:

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

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

但是在Windows中,没有这样的东西,因此没有这样的区别。

+0

在库中,如果将符号的可见性更改为仅限于库,有时可以改进此功能。在gcc兼容的编译器上,这可以通过在函数原型中添加__attribute __((visibility(“hidden”)))来完成。这对所有操作系统和体系结构都没有帮助,但它有时可以改进并且不会受到影响。 – Art

+0

@Art:对!我的首选是使用'-fvisibility = hidden'进行编译,然后将'__attribute __((visibility(“default”))'仅仅添加到要导出的符号。 – rodrigo

+0

我看到有一个链接器选项-Bsymbolic,它使引用一个共享库绑定到该库中的符号,我想这样你不需要改变可见性,如果你不想。 –

0

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

相关问题