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