假设B
是D
的基类(可能是虚拟的,可能是多重继承,不一定是直接基类)。
让obj
成为D
类型的对象(不是D
的子类 - 正是D
)。
让
D * d = std::addressof(obj);
B * b = d;
我们可以安全地假设
(char*) d <= (char*) b && (char*) b < (char*) d + sizeof(D)
背景:这将成为例程中的一个步骤,用于确定某个对象是否已由特定new
中的展示位置aligned_storage
创建。我需要确定,如果是,所有指向此对象的基础对象的指针都指向aligned_storage
中的某个地址。
答案 0 :(得分:0)
我很确定你的假设是安全的,因为D是对象的最终类型。否则,首先使用新的位置将是危险的。
#include <stdlib.h>
#include <new>
struct B { int i; };
struct D : virtual B { int j; };
int
main()
{
auto const storage = malloc(sizeof(D));
D* d = new (storage) D();
free(storage);
return 0;
}
如果B
位于d
之前,则新位置需要返回根据D
的布局调整的指针,但是&#34;标准分配函数void *运算符new(std :: size_t,void *)...只是将第二个参数保持不变。&#34; (http://en.cppreference.com/w/cpp/language/new)同样,B
的存储位置不能超出(char*)d + sizeof(D)
,因为它会超出分配的内存。
感谢分享一个有趣的问题。也许自问这个问题后你已经找到了一个更令人满意的答案。我有兴趣阅读一个更具体的证据,说明为什么假设成立。