即使没有明确定义为内联,一个非常短的函数是否可以内联?

Joe*_*eda 6 c c++ inline-functions

我事先知道,当用C或C++编写程序时,即使我将函数声明为"内联",编译器也可以自由地忽略它并决定不在每次(或任何)调用时展开它.

反之亦然吗?也就是说,如果编译器认为这样做会导致性能提升,编译器是否可以自动内联一个非定义为内联的非常短的函数?

另外两个子问题:这种行为是在ANSI标准的某处定义的吗?在这方面C是否与C++不同,或者它们的行为是否相同?

Fra*_*eux 11

inline关于函数是否将由编译器内联而言是非约束性的.这最初是它打算做的.但从那以后,人们已经意识到函数是否值得内联取决于函数本身的调用站点,并且最好留给编译器来决定.

来自https://en.cppreference.com/w/cpp/language/inline:

由于关键字inline的这个含义是非绑定的,编译器可以自由地使用内联替换任何未标记为内联的函数,并且可以自由地生成对内联标记的任何函数的函数调用.这些优化选择不会更改有关上面列出的多个定义和共享静态的规则.

编辑:既然您也要求C, 请访问https://en.cppreference.com/w/c/language/inline:

内联说明符的目的是作为编译器执行优化的提示,例如函数内联,它要求函数的定义在调用站点可见.为了优化,编译器可以(并且通常会)忽略内联说明符的存在或不存在.

  • @JoePineda是的.让编译器为您实现微优化,现代编译器通常非常擅长. (7认同)
  • 很少有人能够优化编译器,他们的代码通常看起来像是由疯狂的疯子编写的. (4认同)