看标题:C++函数内联是什么意思?
该函数放在代码中,而不是被调用,类似于使用宏(概念上)
这可以提高速度(没有函数调用),但会导致代码膨胀(如果函数使用了100次,那么现在有100个拷贝)
你应该注意这并没有强制编译器使函数内联,如果它认为它是一个坏主意它会忽略你.类似地,编译器可能决定为您内联正常函数.
这也允许你将整个函数放在一个头文件中,而不是在一个cpp文件中实现它(你无论如何都不能这样做,因为如果它被声明为内联,你会得到一个未解析的外部,除非当然只有那个cpp文件使用它).
它只意味着一件事和一件事:编译器将忽略函数的多个定义.
函数通常不能多次定义(即,如果将非内联函数定义放入标题中,然后将#include到多个编译单元中,则会收到链接器错误).将函数定义标记为"inline"会抑制此错误(链接器确保正确的事情发生).
它并不意味着更多!
最重要的是,它并不意味着编译器会将编译的函数嵌入到每个调用站点中.这是否完全取决于编译器的奇思妙想,通常内联修饰符很少或根本没有改变编译器的思想.编译器可以-也确实-内联函数不是内嵌标记,它可以使函数调用该函数是内联标记.
要记住要遵守多个定义.
除了关于性能影响的其他(完全正确的)答案inline
,在C++中你还应该注意这允许你安全地在函数头中放置一个函数:
// my_thing.h inline int do_my_thing(int a, int b) { return a + b; } // use_my_thing.cpp #include "my_thing.h" ... set_do_thing(&do_my_thing); // use_my_thing_again.cpp ... set_other_do_thing(&do_my_thing);
这是因为编译器只在第一个目标文件中包含函数的实际主体,需要编译常规可调用函数(通常因为它的地址被采用,如上所示).
如果没有inline
关键字,大多数编译器会给出关于多个定义的错误,例如对于MSVC:
use_my_thing_again.obj : error LNK2005: "int __cdecl do_my_thing(int,int)" (?do_my_thing@@YAHHH@Z) already defined in use_my_thing.obj <...>\Scratch.exe : fatal error LNK1169: one or more multiply defined symbols found