Ton*_*ony 18 c++ compiler-construction optimization inline
在C++中,如果方法是显式声明inline(或在头文件中定义),或者允许编译器在他们认为合适的情况下内联方法,那么这些方法是否只有内联?
Unc*_*ens 38
该在线关键字真的只是告诉连接(或者告诉编译器告诉链接)功能相同的多个相同的定义是不是一个错误.如果要在标头中定义函数,则需要它,否则如果标头包含在多个编译单元中,则会从链接器中获得"多个定义"错误.
选择内联作为关键字的基本原理似乎是人们想要在头文件中定义(非模板)函数的唯一原因是它可以由编译器内联.除非具有完整定义,否则编译器不能内联函数调用.如果函数没有在头文件中定义,则编译器只有声明,即使它想要也不能内联函数.
如今,我听说,不仅是编译器优化了代码,而且链接器也可以做到这一点.即使函数未在同一编译单元中定义,链接器也可以(如果它们没有这样做)内联函数调用.
如果有的话,在头文件中定义大于单行的函数可能不是一个好主意(编译时间不好,如果内联大函数,可能会导致膨胀和性能下降).
Meh*_*ari 27
是的,编译器可以内联代码,即使它没有明确声明为inline.
基本上,只要语义没有改变,编译器就可以虚拟地对生成的代码做任何想做的事情.该标准不会对生成的代码强制执行任何特殊操作.
编译器可能会内联任何函数,也可能不会内联它.他们被允许使用inline装饰作为这个决定的暗示,但他们也被允许忽略它.
另请注意,如果类成员函数inline在类定义中定义,则它们具有隐式修饰.