什么时候编译器内联C++代码?

Ton*_*ony 18 c++ compiler-construction optimization inline

在C++中,如果方法是显式声明inline(或在头文件中定义),或者允许编译器在他们认为合适的情况下内联方法,那么这些方法是否只有内联?

Unc*_*ens 38

在线关键字真的只是告诉连接(或者告诉编译器告诉链接)功能相同的多个相同的定义是不是一个错误.如果要在标头中定义函数,则需要它,否则如果标头包含在多个编译单元中,则会从链接器中获得"多个定义"错误.

选择内联作为关键字的基本原理似乎是人们想要在头文件中定义(非模板)函数的唯一原因是它可以由编译器内联.除非具有完整定义,否则编译器不能内联函数调用.如果函数没有在头文件中定义,则编译器只有声明,即使它想要也不能内联函数.

如今,我听说,不仅是编译器优化了代码,而且链接器也可以做到这一点.即使函数未在同一编译单元中定义,链接器也可以(如果它们没有这样做)内联函数调用.

如果有的话,在头文件中定义大于单行的函数可能不是一个好主意(编译时间不好,如果内联大函数,可能会导致膨胀和性能下降).


Meh*_*ari 27

是的,编译器可以内联代码,即使它没有明确声明为inline.

基本上,只要语义没有改变,编译器就可以虚拟地对生成的代码做任何想做的事情.该标准不会对生成的代码强制执行任何特殊操作.

  • 既然编译器为我们做了一切,为什么我们需要一个内联提示呢? (2认同)
  • @lz_prgmr:嗯,除了下面 UncleBens 提到的微妙点之外,我认为我们没有。值得注意的是,编译器从一开始就不是那么聪明,我们有点坚持该语言的旧功能。 (2认同)

sbi*_*sbi 5

编译器可能会内联任何函数,也可能不会内联它.他们被允许使用inline装饰作为这个决定的暗示,但他们也被允许忽略它.

另请注意,如果类成员函数inline在类定义中定义,则它们具有隐式修饰.