我正在研究C中的内联函数,并且已经讨论了有关其使用限制的部分.它说:
The compiler also cannot perform
inlining if the address of the
function is taken implicitly or
explicitly.
有人可以向我解释,也许是某种例子,究竟是什么意思?
解决方法
编译器对函数内联有两个不同的决定:
第一个是由编译器根据具体情况决定的,如果在那时可以进行内联.如果函数是虚函数或通过函数指针调用它是不可能的,并且它无法在编译时确定要调用哪个函数.如果编译器无法使用该定义,则可能是因为它在不同的转换单元中定义,并且编译器不执行“整个程序优化”.该决定可能会或可能不会受到函数是否被内联声明以及其他因素(例如其大小和调用频率)的影响.
第二个取决于是否需要非内联版本.如果没有内联任何调用,则需要它.如果任何东西需要函数的地址,它也将(根据你的引用)被要求,因为它必须有一个地址.这可以直接发生(例如通过将地址分配给函数指针),也可以间接发生(例如,虚函数需要将其地址存储在某处以根据对象的动态类型查找运行时).
非内联版本的存在不会阻止对函数的任何特定调用进行内联,尽管它可能会影响编译器的决策,特别是如果它被配置为优化代码大小.
总而言之,您的报价过于简单,并不完全准确;如果地址被采用,编译器仍然可以“执行内联”,它只是不能省略非内联版本.