Bap*_*ton 6 c++ inline function
我正在学习C++中的内联函数,并且已经涉及到有关其使用限制的部分.它说:
如果隐式或显式地采用函数的地址,编译器也不能执行内联.
有人可以向我解释,也许是某种例子,究竟是什么意思?
您可以将任何函数标记为内联.即使是虚拟函数,甚至是递归函数,甚至是veeery veery long函数,即使它的地址被采用.内联函数和非内联函数之间的主要区别在于前者的定义必须出现在使用它的每个转换单元(也就是源文件)中(这就是内联函数通常在.h文件中定义的原因),而后者必须只定义一次.您可以使用内联函数以各种方式使用非内联函数.
实际的内联部分取决于编译器.例如,如果您的函数是递归的或者太长,它可以忽略您的请求.另一方面,编译器可能会选择内联您实际上未标记为内联的函数.
编译器对函数内联有两个不同的决定:
第一个是由编译器根据具体情况决定的,如果在那时可以进行内联.如果函数是虚函数或通过函数指针调用它是不可能的,并且它无法在编译时确定要调用哪个函数.如果编译器无法使用该定义,则可能是因为它在不同的转换单元中定义,并且编译器不执行"整个程序优化".该决定可能会或可能不会受到声明该功能的影响inline,以及其大小和调用频率等其他因素的影响.
第二个取决于是否需要非内联版本.如果没有内联任何调用,则需要它.如果任何东西需要函数的地址,它也将(根据你的引用)被要求,因为它必须有一个地址.这可以直接发生(例如通过将地址分配给函数指针),也可以间接发生(例如,虚函数需要将其地址存储在某处以根据对象的动态类型查找运行时).
非内联版本的存在不会阻止对函数的任何特定调用进行内联,尽管它可能会影响编译器的决策,特别是如果它被配置为优化代码大小.
总而言之,您的报价过于简单,并不完全准确; 如果地址被采用,编译器仍然可以"执行内联",它只是不能省略非内联版本.