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
相关产品推荐
相关产品推荐

