上行对象的地址

Address of upcast object

本文关键字:地址 对象      更新时间:2023-10-16

假设BD的基类(可能是虚拟的,可能是多重继承,不需要是直接基类)。

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中的某个地址。

我非常确信,如果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之前,则placement new将需要返回一个根据D的布局调整的指针,但"标准分配函数void*operator new(std::size_t,void*)…只是返回其第二个参数不变。"(http://en.cppreference.com/w/cpp/language/new)同样地,B的存储器不能被定位为使得它扩展到(char*)d + sizeof(D)之外,因为它会溢出所分配的存储器。

感谢您分享一个有趣的问题。也许自从提出这个问题以来,你已经找到了一个更令人满意的答案。我有兴趣阅读一个更具体的证据来证明为什么这个假设成立或不成立。