gpt4 book ai didi

c++ - upcast 对象的地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:12 25 4
gpt4 key购买 nike

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

objD 类型的对象(不是 D 的子类——恰好是 D ).

D * d = std::addressof(obj);
B * b = d;

我们可以安全地假设

(char*) d <= (char*) b && (char*) b < (char*) d + sizeof(D)

?

背景:这将成为确定某个对象是否已通过在特定 aligned_storage 中放置 new 创建的例程中的一个步骤。我需要确保,如果是,指向该对象的基础对象的所有指针都指向 aligned_storage 中的某个地址。

最佳答案

我很确定你的假设是安全的,因为 D 是对象的最终类型。否则一开始就使用 placement new 是不可靠的。

#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 的布局调整的指针,但是“the标准分配函数 void* operator new(std::size_t, void*) ... 简单地返回它的第二个参数不变。” ( http://en.cppreference.com/w/cpp/language/new ) 同样,B 的存储不能超出 (char*)d + sizeof(D),因为它会超出分配的内存.

感谢分享一个有趣的问题。或许自从问出这个问题你就已经找到了更满意的答案。我有兴趣阅读关于该假设成立或不成立的更具体的证明。

关于c++ - upcast 对象的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34561176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com