c++ - 为什么允许指向内联函数的指针?

标签 c++ function inline

我有两个问题:

1) 为什么在 C++ 中允许指向内联函数的指针? 我读过内联函数的代码只是被复制到函数调用语句中,并且内联函数中没有编译时内存分配。那么,既然内联函数没有固定的内存地址,为什么还有指向内联函数的指针呢?

2) 考虑下面的代码:

inline void func()    
{
    int n=0;
    cout<<(&n);
} 

不应该在每次调用func()时打印出不同的n地址值吗? [因为我认为每次复制内联函数代码时,都必须重新分配局部变量(而在普通函数的情况下,会发生重新初始化)]

我是初学者,我问这个问题是为了加强我的概念。如果我在任何地方错了,请纠正我。

最佳答案

1) Why pointers to inline functions are allowed in c++?

因为内联函数和其他函数一样是函数,指向它们是你可以用函数做的事情之一。内联函数在这方面并不特别。

I have read that code of inline functions just get copied to the function calling statement and there is no compile time memory allocations in inline functions.

您(可能还有您阅读过的 Material )混合了两个相关且名称相似的概念。

内联函数在所有使用它的翻译单元中定义,而非内联函数仅在一个定义规则要求的情况下在一个翻译单元中定义。这就是函数的内联声明的含义;它放宽了单一定义规则,但也给出了在所有使用它的翻译单元中定义的附加要求(如果不放宽 odr,这是不可能的)。

内联扩展(或内联)是一种优化,通过将被调用函数复制到调用者的框架中来避免函数调用。函数调用可以内联扩展,无论该函数是否被声明为内联。而且声明为内联的函数不一定是内联展开的。

但是,函数不能在未定义的翻译单元中内联扩展(除非链接时间优化执行扩展)。因此,在内联声明允许的所有 TU 中定义的要求,也使得函数的内联扩展成为可能,方法是允许在调用它的所有 TU 中定义函数。但不能保证优化。

2) Should it not print different values of address of n each time func() is called?

内联扩展确实会导致局部变量位于调用者的框架中,是的。但是,如果调用来自不同的帧,则无论扩展如何,它们的位置都会有所不同。

对于内联扩展的任何函数,通常都会生成一个常规的非扩展版本。如果一个函数的地址被占用,它将指向那个未扩展的函数。如果编译器可以证明对函数的所有调用都是内联的,那么编译器可能会选择根本不提供非扩展版本。这要求函数具有内部链接,而获取函数的地址通常会使这种证明变得非常困难或不可能。

关于c++ - 为什么允许指向内联函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41736830/

相关文章:

c++ - 从 QVariant 参数转换时如何选择方法重载?

c++ - 如何使用 toInt 从 Qt 中的 QByteArray 中提取整数?

c++ - 结构和类在 C++ 中真的是等价的吗?

c++ - 何时重载逗号运算符?

javascript - JSLint 错误 : "unnecessary else after disruption"

javascript - 如何根据url hash url执行一个js函数#nameoffunction

c++ - 这是内联函数的有效用法吗?

c++ - 理解 C++ 中的指针

c# - 为什么默认情况下不内联自动属性?

c++ - 模板类特化的C++内联或非内联声明