我知道函数指针的地址在不同的编译单元之间不会改变。
struct Interface
{
void sum(int, int);
};
例如,&Interface::sum
将在不同的单位之间产生相同的值(我错了吗?(。
- 这在多大程度上成立?在不同的机器、系统上编译时,地址会相同吗
- 函数地址是否可以作为在公共标头中使用的可靠工具?例如,将其用于内部映射或标记调度
我怀疑使用不同的编译器时可能会有所不同。
假设函数指针的大小相同(即x64(,我会问这个问题。
首先,我想强调sum
是一个方法这一事实与答案无关。
其次,所有编译单元的地址都是相同的,因为它是最高效的——否则,您必须在可执行文件中复制sum
。如果它只在一个地方,那么每个呼叫者只能在那里call
。
第三,即使重新运行程序,地址也可能不相同。如果可执行文件加载到相同的基地址,它可能会,但不能保证。因此,地址也不能保证在不同的机器/系统上是相同的,并且不是在头文件中使用的可靠工具。
最后,不同的编译器,甚至在稍微更改代码后使用相同的编译器,可能会将sum
放在可执行文件的不同位置,因此您最终的怀疑是正确的。