加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 上传对象的地址

发布时间:2020-12-16 06:50:51 所属栏目:百科 来源:网络整理
导读:假设B是D的基类(可能是虚拟的,也许是多重继承,不必是直接的基类). 设obj是D类型的对象(不是D的子类 – 完全是D). 让 D * d = std::addressof(obj);B * b = d; 我们可以安全地假设 (char*) d = (char*) b (char*) b (char*) d + sizeof(D) ? 背景:这将成为
假设B是D的基类(可能是虚拟的,也许是多重继承,不必是直接的基类).

设obj是D类型的对象(不是D的子类 – 完全是D).

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

我们可以安全地假设

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

背景:这将成为例程中的一个步骤,用于确定某个对象是否已通过在特定aligned_storage中的placement new创建.我需要确定,如果是,所有指向此对象的基础对象的指针都指向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之前,则放置new将需要返回基于D的布局调整的指针,但“标准分配函数void * operator new(std :: size_t,void *)…只返回其第二个参数不变“. (http://en.cppreference.com/w/cpp/language/new)同样,B的存储位置不能超出(char *)d sizeof(D),因为它会超出分配的内存.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读