编译器如何决定是否应该考虑内联函数?
与链接不同,不存在“内联”冲突(同名声明可能内联或不内联)。
例如,函数的多个声明可以有内联或不内联,例如:
inline static void test(); // declaration with inline
int main()
{
extern void test(); // declaration without inline.
test();
}
static void test() // definition does not have inline
{
}
或
static void test(); // declaration without inline
int main()
{
test();
}
inline static void test() // but definition has inline!
{
}
在每种情况下,test()都会内联吗?
我真正的问题是,编译器如何发现函数应该内联? 是否查看最近的声明是否带有内联关键字,还是查看定义是否内联关键字?
我试图在标准中搜索它,但我找不到任何关于这种模糊性的规则。看起来内联在标准中的定义非常模糊。
(我最初认为应该有一个“规则”,一旦函数被内联声明,强制执行,每个相同名称的声明也必须是内联的。)
inline static void test() // definition with inline keyword
{
}
int main()
{
extern void test(); // declaration without inline
test(); // Does compiler consider inlining or not?
}
答案 0 :(得分:4)
我真正的问题是,编译器如何发现函数应该内联?是否查看最近的声明是否带有内联关键字,还是查看定义是否内联关键字?
通常,编译器根据(1)函数的主体是否在头文件中以及(2)特定于编译器的经验法则来决定是否内联函数,以确定内联是否有净收益。 / p>
inline
关键字旨在提供帮助,但与register
关键字非常相似,它在生成代码时实际上并没有提供太多帮助。相反,inline
只是意味着“如果您不止一次看到此定义,请不要抱怨(因为我将其粘贴在头文件中)。”
“不要抱怨”这就是为什么你的代码不会抱怨,即使它可能应该。
如果您要使用关键字,不将其置于转发声明中,执行将其置于定义中(执行将定义放在标题中:
void test();
/* ... other declarations ... */
/* (in the same file) */
inline void test() { printf("inlined!\n"; }
实际上有理由这样做:您可能不希望使用实现来混淆声明。