在为内联函数指定调用约定时有没有意义?例如,我正在写SIMD数学库,建议使用__vectorcall
,但我所有的函数都是内联的。在一些文章中,我看到人们将所有函数内联,并且仍然说,你需要用默认的__vectorcall
约定(或者实际上将这个属性)编译库。
当函数不是内联时,我可以看到程序集中的差异。但是,为内联函数指定调用约定有什么意义,因为它不是一个真正的函数调用?为内联函数指定__vectorcall
不是更好吗?内联函数和调用约定
回答
inline关键字只是编译器的一个建议;它不保证该函数将被内联。例如,递归函数不能内联,如果使用函数指针,编译器可能需要生成其他内联函数的非内联副本。此外,对内存和空间的限制可能会阻止编译器内联一个函数。因此,即使你标记了一个函数内联,你仍然需要指定一个调用约定(如果合适的话),因为不能保证编译器确实会消除函数调用。
“递归函数不能内联”如果编译器能够优化递归到迭代中,它可以内联。如果编译器能够在编译时预测递归深度,它可以被展开和内联...... –
@Revolver_Ocelot这是真的,尽管通常编译器无法做到这一点(谢谢,Halting Problem!)你知道吗任何编译器在除尾调用以外的其他情况下执行此操作? – templatetypedef
GCC和Clang都努力将不完全尾递归转化为迭代。我没有证据表明部分内联不可优化的递归函数 –
- 1. 函数指针和调用约定
- 2. 函数调用约定
- 3. jQuery - 调用内联函数
- 4. 内联函数调用静态内联函数
- 5. 代码约定函数和回调
- 6. 调用约定函数返回结构
- 7. boost :: function_types函数调用约定
- 8. ASM内联调用C外部函数
- 9. 可以HotSpot内联lambda函数调用?
- 10. 调用静态内联函数
- 11. Javascript调用函数或内联代码?
- 12. 预处理宏调用内联函数
- 13. 夫特回调内联函数用法
- 14. Queryable Select中的内联函数调用
- 15. 内联函数调用错误
- 16. 约构造函数调用和继承
- 17. 内联函数定义
- 18. 总和类型函数参数的GHC调用约定
- 19. 内联函数和静态内联函数之间的区别
- 20. Postgresql和内联函数
- 21. 互斥和内联函数
- 22. C,内联函数和GCC
- 23. get/set函数和内联
- 24. 自定义X86_64调用约定到C函数调用
- 25. 调用内联函数时未定义的引用
- 26. 内联汇编:注册引用约定
- 27. OpenCL用户定义的内联函数
- 28. 函数定义之前的调用不能被内联?
- 29. 从内联事件调用的自定义jQuery函数
- 30. 内联函数
http://stackoverflow.com/a/36852518/2542702 –