inline关键字仅仅是对编译器的建议,编译器有权力决定一个函数是否在调用处嵌入。因为内联函数要在调用处展开,编译器必须能在每一个调用处能看到该函数的定义,因此最好将函数实现放在头文件中(而且实现在类定义中的成员函数即便不加inline关键字也会自动成为内联函数)。在实现文件中该函数之前要加上inline关键字的方式是有问题的:如果调用的obj文件在函数定义之前生成,那么该处就无法嵌入内联函数了。如果普通函数需要成为内联函数,在定义时加上inline关键字。
注意:
- 包含了递归、循环等结构的函数一般不会被内联。
- 虚拟函数一般不会内联,但是如果编译器能在编译时确定具体的调用函数,那么仍然会就地展开该函数。
- 如果通过函数指针调用内联函数,那么该函数将不会内联而是通过call进行调用。
- 构造和析构函数一般会生成大量代码,因此一般也不适合内联。
- 如果内联函数调用了其他函数也不会被内联。
如果想要阻止某函数被内联,可以在函数体前加上 attribute((noinline)) 。 实际上除了上述需要注意的项目,下面这个也同样重要:
在C++中,内联函数必须是和函数体申明在一起,才有效。像这样的申明 Inline Tablefunction(int I);
是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。 Inline tablefunction(int I)
{return I*I}; 这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。
个人经验来说:
在C++中,当有多个函数文件时,内联函数的定义与声明必须放在头文件中,在A函数文件中定义的内联函数不能在B函数文件中使用,即使是main函数。
(error:无法解析的外部符号 “bool __cdecl compareIsbn(class Sales_data const &,class Sales_data const &)” ([email protected]@[email protected]@[email protected]),该符号在函数 _main 中被引用)
这种错误在编译时是发现不了的,当程序运行时才会发生,一定要注意!!!