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),因为它会超出分配的内存. 感谢您分享一个有趣的问题.也许自问这个问题后你已经找到了一个更令人满意的答案.我有兴趣阅读更具体的证据,为什么假设成立或不成立. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 《从零开始学Swift》学习笔记(Day 70)——Swift与Objecti
- PostgreSQL VS MySQL
- flex CurrencyValidator flex 教程 flex培训 flex源码 flex
- ruby-on-rails – 只有上一个和下一个按钮的Kaminari ajax分
- Oracle:如何使用不同的where子句以最佳方式执行多个计数?
- flash大小选择和添加mtd的data分区 -- linux内核
- PostgreSQL 强大的多层表继承--及其在海量数据分类按月分区
- jmeter 生成聚合报告
- .net 使用 Newtonsoft.Json 输出树状 json字符串
- 从Xcode 4.2升级到Xcode 4.3后,仪器命令行失败