只是询问 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(...)
,可以用于根据方法的指针查找方法/槽的索引。
C++ 标准中没有非静态成员函数地址的概念。不可能获得此类函数的地址(在编译代码中的指令/符号地址的意义上)。
但是,指向成员的指针确实存在,并且如果两个函数都是非虚拟的,则
static_assert(&MyClassB::maybeOptimize2 != &MyClassA::maybeOptimize1);
保证成功。 (否则结果未指定。)
如何实现取决于编译器。例如,在用于非虚拟非静态成员函数的Itanium C++ ABI中,函数指针与对象指针调整存储在一起,我不认为对函数进行重复数据删除将允许区分指针,因此它不会这不是允许的优化。
据我所知,MSVC 的成员指针实现不符合标准,所以我不知道它在那里会如何表现。