我知道在不同的编译单元中,函数指针的地址不会改变。
struct Interface
{
void sum(int, int);
};
例如 &Interface::sum
在不同单位之间会产生相同的值(我说错了吗?
我猜测当使用不同的编译器时可能会有所不同。
我问这个问题的前提是我们对函数指针的大小是一样的(例如x64)。
首先,我想强调的是,事实是 sum
是一个方法与答案无关。
其次,地址在所有编译单元中都是相同的,因为这是最有效的--否则,你必须重复使用 sum
在可执行文件中。如果它只在一个地方,每个调用者可以只在 call
那里。
第三,即使你重新运行程序,地址也可能不一样。可能会,如果可执行文件加载到相同的 基本地址但不能保证。因此,这个地址在不同的机器系统上也不能保证是一样的,在头文件中也不是一个可靠的工具。
最后,不同的编译器,甚至使用同一个编译器,在稍微改变代码后,可能会把地址放在 sum
在你的可执行文件的不同位置,所以你最后的怀疑是正确的。