c++ - C++ 函数指针的地址不变性
问题描述
我知道函数指针的地址在各种编译单元之间不会改变。
struct Interface
{
void sum(int, int);
};
例如,&Interface::sum
将在不同单位之间产生相同的值(我错了吗?)。
- 这在多大程度上成立?在不同的机器、系统上编译时地址是否相同?
- 函数地址能否成为在公共标头中使用的可靠工具?例如,将其用于内部映射或标签调度。
我怀疑使用不同的编译器时可能会有所不同。
我问这个假设我们有相同的函数指针大小(即x64)。
解决方案
首先,我想强调的是,它sum
是一种方法这一事实与答案无关。
其次,所有编译单元的地址都是相同的,因为它是最有效的 - 否则,您必须sum
在可执行文件中复制。如果它只在一个地方,那么每个呼叫者都可以在call
那里。
第三,即使重新运行程序,地址也可能不一样。如果可执行文件加载到相同的基地址,它可能会,但不能保证。因此,地址也不能保证在不同的机器/系统上相同,并且不是在头文件中使用的可靠工具。
最后,不同的编译器,甚至在稍微更改代码后使用相同的编译器,可能会放置sum
在可执行文件中的不同位置,因此您最终的怀疑是正确的。
推荐阅读
- nginx - 在 Nginx 中安装 CA 证书文件
- c# - CheckedListBox 的扩展方法出错 - CS0201
- reactjs - 如果反应引导表 2 中没有数据,如何设置默认单元格值
- excel - 完全工作的 vba 不能在其他机器上运行
- java - 如何将多个地图放在一起
> 不覆盖集合 - flutter - 如何解决“令牌检索失败:SERVICE_NOT_AVAILABLE”这个问题?
- javascript - 谷歌地图仅在 Chrome 浏览器中获取“initMap 不是函数”
- oracle - 需要帮助解决 ORA-12154
- c# - 在 FluentAssertions.Primitives.ObjectAssertions 的扩展方法中调用 Excluding 方法不起作用,但调用它正常工作
- nginx - 如何为 NGINX 负载均衡器设置异常