当前位置:  开发笔记 > 编程语言 > 正文

C++函数内联意味着什么?

如何解决《C++函数内联意味着什么?》经验,为你挑选了3个好方法。

看标题:C++函数内联是什么意思?



1> Fire Lancer..:

该函数放在代码中,而不是被调用,类似于使用宏(概念上)

这可以提高速度(没有函数调用),但会导致代码膨胀(如果函数使用了100次,那么现在有100个拷贝)

你应该注意这并没有强制编译器使函数内联,如果它认为它是一个坏主意它会忽略你.类似地,编译器可能决定为您内联正常函数.

这也允许你将整个函数放在一个头文件中,而不是在一个cpp文件中实现它(你无论如何都不能这样做,因为如果它被声明为内联,你会得到一个未解析的外部,除非当然只有那个cpp文件使用它).


注意:内联确实_not_表示函数将被内联.它_might_内联,仍然由编译器决定.但是,在语言/语义级别,内联意味着可以在多个模块中定义函数而不会出现链接时错误.(虽然定义仍然必须匹配).
"你应该注意这并没有强迫编译器使函数内联"

2> DrPizza..:

它只意味着一件事和一件事:编译器将忽略函数的多个定义.

函数通常不能多次定义(即,如果将非内联函数定义放入标题中,然后将#include到多个编译单元中,则会收到链接器错误).将函数定义标记为"inline"会抑制此错误(链接器确保正确的事情发生).

它并不意味着更多!

最重要的是,它并不意味着编译器会将编译的函数嵌入到每个调用站点中.这是否完全取决于编译器的奇思妙想,通常内联修饰符很少或根本没有改变编译器的思想.编译器可以-也确实-内联函数不是内嵌标记,它可以使函数调用该函数内联标记.

要记住要遵守多个定义.


我也在GCC工作过.在这张海报基本上是正确的.这篇文章应该在列表的顶部.

3> Simon Buchan..:

除了关于性能影响的其他(完全正确的)答案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

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有