首页 > 解决方案 > C++ 函数指针的地址不变性

问题描述

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

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

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

  1. 这在多大程度上成立?在不同的机器、系统上编译时地址是否相同?
  2. 函数地址能否成为在公共标头中使用的可靠工具?例如,将其用于内部映射或标签调度。

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

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

标签: c++compilationmember-function-pointers

解决方案


首先,我想强调的是,它sum是一种方法这一事实与答案无关。

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

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

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


推荐阅读