我知道由于双跳而在DSO中调用函数的开销更大。与在同一个编译单元中调用一个函数相比,在单独的编译单元中调用函数时是否有更多的开销(假设它们在两种情况下都没有内联)?在单独的编译单元中调用函数是否有更多开销?
4
A
回答
4
一般来说,它们将是相同的,而不是内联或其他全局优化的机会。但根据架构的不同,可能会有细微的差异。
例如,在的Linux/Unix,这个问题是不是不同的CU的功能之间,但你调用的函数是否有外部链接,或不:
void foo() {}
void bar()
{ foo(); }
或者:
static void foo() {}
void bar()
{ foo(); }
如果将此代码编译为共享对象(但不是可执行文件!),则外部foo()
可能会被另一个共享对象覆盖(例如,通过LD_LIBRARY_PRELOAD
),但静态的不能。因此,即使来自同一个CU,对共享对象内的外部函数的调用也必须使用可重定位的跳转来完成。
但是在Windows中,没有这样的东西,因此没有这样的区别。
0
我看到的唯一可能的开销是使用可变长度跳转宏,在跳过编译单元时可能总是有最大长度(除非链接器优化)。
相关问题
- 1. Scala宏和单独的编译单元
- 2. 高级函数调用的闭包转换和单独编译
- 3. 位于单独服务器上的图像 - 是否有开销?
- 4. Visual Studio C编译器中是否存在单独的bitset64内部函数?
- 5. 类,成员函数和单独编译
- 6. C++中的单独编译
- 7. 是否有可能在Ada中有一个子包作为单独的编译单元
- 8. Excel:函数调用应用于整列的单独单元格
- 9. GTest没有在独立的编译单元中找到测试
- 10. Android中是否有编译时函数?
- 11. 在一个Scala项目中可以有单独的编译单元吗?
- 12. 使用slf4j与log4j和单独使用log4j是否有任何性能开销?
- 13. 是否有更多的开销在单个语句中编码,然后逐步分解?
- 14. 在GHC中编译单独的模块
- 15. 是否可以在asp:checkbox中调用2个单独的函数onClick事件?
- 16. 更新多个单独元素的JavaScript函数
- 17. 有没有办法单独输出单个函数的汇编?
- 18. 是否有可能为单独的href格式化单元格
- 19. 是否有可能在C++中禁止在编译时调用某个函数?
- 20. 是否有调用单参数XSL函数的快捷方式?
- 21. 如何在Eclipse中将我的项目从多个编译单元转换为单个编译单元
- 22. 在单独的函数中使用getline()
- 23. 在单个DCU中编译多个单元
- 24. 如何测试函数是否被调用(单元测试角)
- 25. Clojure单元测试:检查函数是否被调用
- 26. 单元测试函数对象是否被调用
- 27. 是否有更好和/或更简单的方法来注销?
- 28. 在单元测试中调用单独的Python程序
- 29. 为什么每个单独调用的函数更新中没有值?
- 30. cgit是否单独运行其编译版本?
在库中,如果将符号的可见性更改为仅限于库,有时可以改进此功能。在gcc兼容的编译器上,这可以通过在函数原型中添加__attribute __((visibility(“hidden”)))来完成。这对所有操作系统和体系结构都没有帮助,但它有时可以改进并且不会受到影响。 – Art
@Art:对!我的首选是使用'-fvisibility = hidden'进行编译,然后将'__attribute __((visibility(“default”))'仅仅添加到要导出的符号。 – rodrigo
我看到有一个链接器选项-Bsymbolic,它使引用一个共享库绑定到该库中的符号,我想这样你不需要改变可见性,如果你不想。 –