You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++标准是否允许二进制相同的不同类方法共享同一函数指针?

C++标准是否允许相同二进制内容的成员函数共享同一地址?

核心问题:当两个成员函数的二进制实现完全相同时,编译器能不能优化成只生成一份机器码,让它们的函数指针指向同一个地址?

示例代码

class MyClassA {
     inline void maybeOptimize1() {
         // 两段代码完全一致的实现
     }
};

class MyClassB : public MyClassA {
     inline void maybeOptimize2() {
         // 和maybeOptimize1完全相同的代码
     }
};

// 标准要求这个断言必须通过
static_assert(&MyClassB::maybeOptimize2 != &MyClassA::maybeOptimize1);

C++标准的明确规定

C++标准中,不同的成员函数是独立的实体,哪怕它们的签名、实现完全一致,它们的函数指针也必须是不相等的。编译器绝对不允许因为二进制内容相同就合并它们的地址——函数指针的相等性判断依据是函数的身份,而不是生成的机器码是否一致。上面的static_assert是符合标准的,任何合规的编译器都必须让这个断言通过。

实际场景的影响

这种规定在一些框架中至关重要,比如Qt:当使用QMetaObject::indexOfMethod配合static_metacall通过函数指针查找方法/槽的索引时,如果编译器违规合并了两个不同函数的地址,就会导致索引查找错误——原本属于不同类的方法会被当成同一个,返回错误的索引,进而引发程序逻辑问题。

内容的提问来源于stack exchange,提问作者Top-Master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:13:12