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

问题描述 投票:1回答:1

我知道在不同的编译单元中,函数指针的地址不会改变。

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

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

  1. 这在什么程度上是成立的?在不同的机器、系统上编译时,地址会不会一样?
  2. 在公共头中,函数地址能否成为一个可靠的工具?比如说,用它来做内部映射或标签调度。

我猜测当使用不同的编译器时可能会有所不同。

我问这个问题的前提是我们对函数指针的大小是一样的(例如x64)。

c++ compilation member-function-pointers
1个回答
3
投票

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

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

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

最后,不同的编译器,甚至使用同一个编译器,在稍微改变代码后,可能会把地址放在 sum 在你的可执行文件的不同位置,所以你最后的怀疑是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.