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