内联函数和调用约定
Inline functions and calling conventions
指定内联函数的调用约定是否有意义?例如,我正在编写 SIMD 数学库,建议使用 __vectorcall
,但我的所有函数都是内联的。在一些文章中,我看到人们内联所有函数,但仍然说,您需要使用默认 __vectorcall
约定(或实际放置此属性)来编译库。
当函数不是内联时,我可以看到汇编中的差异。但是为内联函数指定调用约定有什么意义,因为它不是真正的函数调用?只为非内联函数指定 __vectorcall
不是更好吗?
inline关键字只是对编译器的一个建议;它不保证函数将被内联。例如,递归函数不能内联,如果您使用函数指针,编译器可能需要生成其他内联函数的非内联副本。此外,内存限制和 space 可能会阻止编译器内联函数。
因此,即使您将函数标记为内联,您仍然需要在适当的情况下指定调用约定,因为无法保证编译器确实会消除函数调用。
指定内联函数的调用约定是否有意义?例如,我正在编写 SIMD 数学库,建议使用 __vectorcall
,但我的所有函数都是内联的。在一些文章中,我看到人们内联所有函数,但仍然说,您需要使用默认 __vectorcall
约定(或实际放置此属性)来编译库。
当函数不是内联时,我可以看到汇编中的差异。但是为内联函数指定调用约定有什么意义,因为它不是真正的函数调用?只为非内联函数指定 __vectorcall
不是更好吗?
inline关键字只是对编译器的一个建议;它不保证函数将被内联。例如,递归函数不能内联,如果您使用函数指针,编译器可能需要生成其他内联函数的非内联副本。此外,内存限制和 space 可能会阻止编译器内联函数。
因此,即使您将函数标记为内联,您仍然需要在适当的情况下指定调用约定,因为无法保证编译器确实会消除函数调用。