上传对象的地址

时间:2016-01-01 23:39:57

标签: c++

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

1 个答案:

答案 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),因为它会超出分配的内存。

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