【发布时间】:2023-04-10 01:31:01
【问题描述】:
当强制内联函数因任何原因内联失败时,是否可以强制编译器(CLang/GCC/MSVC)抛出编译错误?
想象下一个代码:
Following code in online compiler!
#include <iostream>
inline __attribute__((always_inline)) int f(int i) {
if (i <= 0)
return 0;
return f(i - 1) + f(i - 2) + i;
};
int main() {
std::cout << f(10) << std::endl;
}
由于两个递归自调用函数 f() 未能内联,尽管 __attribute__((always_inline)) 指示始终内联。您可以通过上面的链接在汇编程序中看到指令call f(int),这意味着该函数没有内联。
上面的代码是否有可能因为内联失败而引发编译错误(在 CLang/MSVC/GCC 中)?也许可以使用一些编译时static_assert(...) 表达式?
我预计非内联可能还有其他原因,包括函数代码的属性和调用方代码的属性。因此,一般而言,您可能无法提前确定您的函数在所有调用的 100% 中是内联的。因此,我的问题的解决方案将很有用。
也有兴趣解决 lambda 函数内联的相同问题。
【问题讨论】:
标签: c++ function optimization inline