C++函数指针的地址不变性

C++ function pointer's address invariance

我知道函数指针的地址在各种编译单元之间不会改变。

struct Interface
{
   void sum(int, int);
};

例如,&Interface::sum 将在不同单位之间产生相同的值(我错了吗?)。

  1. 这在多大程度上成立?在不同的机器、系统编译时地址会相同吗?
  2. 函数地址可以成为 public header 中使用的可靠工具吗?例如,将其用于内部映射或标记调度。

我怀疑使用不同的编译器时可能会有所不同。

我问这个假设我们有相同大小的函数指针(即 x64)。

首先要强调的是,sum是一个方法,与答案无关。

其次,所有编译单元的地址都相同,因为它是最有效的 - 否则,您必须在可执行文件中复制 sum。如果它只在一个地方,每个呼叫者都可以 call 那里。

第三,即使重新运行程序,地址也可能不一样。它可能会,如果可执行文件加载到相同的 基地址 ,但不能保证。因此,地址也不能保证在不同的 machine/system 上是相同的,并且不是在头文件中使用的可靠工具。

最后,不同的编译器,甚至在稍微更改代码后使用相同的编译器,可能会将 sum 放在可执行文件中的不同位置,因此您最后的怀疑是正确的。