2016-06-18 62 views
1

在为内联函数指定调用约定时有没有意义?例如,我正在写SIMD数学库,建议使用__vectorcall,但我所有的函数都是内联的。在一些文章中,我看到人们将所有函数内联,并且仍然说,你需要用默认的__vectorcall约定(或者实际上将这个属性)编译库。
当函数不是内联时,我可以看到程序集中的差异。但是,为内联函数指定调用约定有什么意义,因为它不是一个真正的函数调用?为内联函数指定__vectorcall不是更好吗?内联函数和调用约定

+0

http://stackoverflow.com/a/36852518/2542702 –

回答

4

inline关键字只是编译器的一个建议;它不保证该函数将被内联。例如,递归函数不能内联,如果使用函数指针,编译器可能需要生成其他内联函数的非内联副本。此外,对内存和空间的限制可能会阻止编译器内联一个函数。因此,即使你标记了一个函数内联,你仍然需要指定一个调用约定(如果合适的话),因为不能保证编译器确实会消除函数调用。

+0

“递归函数不能内联”如果编译器能够优化递归到迭代中,它可以内联。如果编译器能够在编译时预测递归深度,它可以被展开和内联...... –

+0

@Revolver_Ocelot这是真的,尽管通常编译器无法做到这一点(谢谢,Halting Problem!)你知道吗任何编译器在除尾调用以外的其他情况下执行此操作? – templatetypedef

+0

GCC和Clang都努力将不完全尾递归转化为迭代。我没有证据表明部分内联不可优化的递归函数 –