【发布时间】:2013-02-15 04:07:41
【问题描述】:
如果我有一个类 Base,至少有一个虚函数,以及一个从该类单独继承的 Derived 类,那么即使 Derived 不是标准布局,(uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived) (由 Itanium ABI)保证为零。但是在一般情况下,这不一定是正确的(例如多重继承)。
是否可以编写一个 trait 来检测一个类是否是另一个类的主要基类?
Itanium ABI 中的有用部分:
http://refspecs.linux-foundation.org/cxxabi-1.83.html
主基类
对于动态类,唯一的基类(如果有的话),它在偏移量 0 处共享虚拟指针。 它是第一个(按直接基类顺序)非虚拟动态基类(如果存在)。
动态类
需要虚拟表指针的类(因为它或其基类有一个或多个虚拟成员函数或虚拟基类)。
【问题讨论】:
-
您的测试表达式与引用的定义完全不匹配。您正在查看基本子对象的地址,而 ABI 正在讨论 v-table 中的条目顺序。
-
@BenVoigt:很好看。我们真的应该有一个指向 ABI 的链接。
-
我非常好奇这些信息可以用来做什么。
-
@BenVoigt 我在看第 2.4 节,我的印象是虚拟表布局都包含在第 2.5 节中?
-
@CrazyEddie 我正在尝试创建一些有用但非常非法的 C++ 的东西。它实际上是一个 boost::variant,但是对于一组无限的派生类(假设它不是太大/对齐)。派生类型使用放置移动构造进行放置,然后提取基类型并调用其虚拟析构函数。添加指针调整值将删除此要求,但我不想添加。这应该是一长串 static_asserts 的一部分。
标签: c++ typetraits memory-layout vptr itanium-abi