C++ C++;-当函数内联不可能时?

C++ C++;-当函数内联不可能时?,c++,inline-functions,object-address,C++,Inline Functions,Object Address,各位 我在阅读“(Chap-内联函数)时遇到了这条语句 “如果 函数是隐式的或显式的” “隐式或显式地获取函数地址”是什么意思? 为什么在这种情况下不能内联 谢谢。获取函数的地址意味着。这可以显式发生,如链接的示例中所示。我不确定作者所说的“隐式”是什么意思-可能是将函数作为参数传递给另一个函数之类的事情 如果取函数的地址,它首先必须有一个地址。因为内联基本上意味着用函数体的副本替换对函数的调用,在这样的转换之后,函数就不存在了,因此没有地址-在过去有对该函数的调用的地方,只有n个相同代码的不同

各位

我在阅读“(Chap-内联函数)时遇到了这条语句

“如果 函数是隐式的或显式的”

“隐式或显式地获取函数地址”是什么意思?
为什么在这种情况下不能内联


谢谢。

获取函数的地址意味着。这可以显式发生,如链接的示例中所示。我不确定作者所说的“隐式”是什么意思-可能是将函数作为参数传递给另一个函数之类的事情


如果取函数的地址,它首先必须有一个地址。因为内联基本上意味着用函数体的副本替换对函数的调用,在这样的转换之后,函数就不存在了,因此没有地址-在过去有对该函数的调用的地方,只有n个相同代码的不同副本因此,如果函数的地址被以任何方式使用,它就不能被内联。

我不确定这是否完全正确。但是,如果你获取一个函数的地址,该函数需要存在于内存中,并带有函数的前导和清除代码。内联时省略了这个前导和清除。你会得到一个完整的loa内联时优化可能性的d

但是现代编译器应该仍然能够在任何可能的地方内联函数。请考虑:

int compare (int a, int b)
{
  return a compared to b
}

int main ()
{
  a = array of ints

  qsort (a, compare); // take address of compare function, thus compare function exists in
                      // app as a proper function

  compare (value1, value2); // there's no reason why this can't be inlined
}
我认为引用应该更明确地说明哪些内容不能内联:

通过函数指针调用的函数不能内联


这是因为在编译时无法确定在间接调用点(通过函数指针的调用)内联什么函数。这并不意味着函数指针指向的函数不能内联到直接调用的任何地方。

实际上,引用可能会误导

如果采用函数地址,则有必要在库/可执行文件中生成函数,因为函数的地址执行包括将指令指针跳转到描述函数的代码块

但是,当直接调用时,它肯定不会阻止编译器在其他位置内联函数

第一,检讨:

// Explicit:
void foo();

void (*func_ptr)() = foo;


// Implicit
struct Foo { virtual void bar() {} }; // address used in V-Table
第二,内联示例:

int main() {
  (*func_ptr)(); // probably not inlined as the compiler can difficultly assert
                 // that nobody may modified it... since it's non-const.

  foo(); // might be inlined

  Foo f;
  f.bar(); // might be inlined (the exact type of `f` is known)
           // this is called, "devirtualizing"

  Foo& g = accessSomeFoo();
  g.bar(); // probably not inlined unless the compiler can assert
           // the type returned by accessSomeFoo
           // (which requires knowing its definition)
}

如果函数是“内联的”,那么它的地址在哪里?理论上可能是。代码如void foo(void);void(*p)(void)=&foo;p()可以由编译器优化。这是否意味着速度优化的编译器将在我不使用函数指针的情况下内联所有内容?@heishe:编译器具有尝试和猜测内联是否更好的启发式。这是一个复杂的主题(你需要对缓存/寄存器等进行推理。)而且非常特定于体系结构。不要太担心;)@heishe:如果你的函数有一个循环,那么它内联的可能性很小甚至没有。所以你要知道,编译器在内联方面是非常有选择性的,即使我们提示它内联某个函数。你的答案的最后一点不是nec确实如此。请看我对@Peter's Response的评论。@Oli:是的,我认为可以在编译时推导的函数指针肯定可以内联,尽管我不明白为什么有人会费劲创建函数指针,为其分配函数,并通过它进行间接调用,而不仅仅是调用直接调用函数。如果使用模板,可能会。