C++ 规范:重复的方法可以共享相同的指针/地址吗?

问题描述 投票:0回答:1

只是询问 C++ 规范/标准,
这与Qt无关,但需要一些Qt知识;

C++ 规范/标准是否允许两个方法具有相同的指针,我的意思是,如果编译器的优化检测到这些方法是二进制相同的,是否允许编译器为两个方法发出一次二进制?

示例:

class MyClassA {
     inline void maybeOptimize1() {
         // Some code.
     }
};

class MyClassB : public MyClassA {
     inline void maybeOptimize2() {
         // Imagine exact same code as `maybeOptimize1()` here.
     }
};

static_assert(&MyClassB::maybeOptimize2 != &MyClassA::maybeOptimize1);

重要性:

例如,在Qt框架中我们有

QMetaObject::IndexOfMethod
,如果将其传递给
static_metacall(...)
,可以用于根据方法的指针查找方法/槽的索引。

qt c++11
1个回答
0
投票

C++ 标准中没有非静态成员函数地址的概念。不可能获得此类函数的地址(在编译代码中的指令/符号地址的意义上)。

但是,指向成员的指针确实存在,并且如果两个函数都是非虚拟的,则

static_assert(&MyClassB::maybeOptimize2 != &MyClassA::maybeOptimize1);
保证成功。 (否则结果未指定。)

如何实现取决于编译器。例如,在用于非虚拟非静态成员函数的Itanium C++ ABI中,函数指针与对象指针调整存储在一起,我不认为对函数进行重复数据删除将允许区分指针,因此它不会这不是允许的优化。

据我所知,MSVC 的成员指针实现不符合标准,所以我不知道它在那里会如何表现。

© www.soinside.com 2019 - 2024. All rights reserved.