上行对象的地址
Address of upcast object
假设B
是D
的基类(可能是虚拟的,可能是多重继承,不需要是直接基类)。
设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)
之外,因为它会溢出所分配的存储器。
感谢您分享一个有趣的问题。也许自从提出这个问题以来,你已经找到了一个更令人满意的答案。我有兴趣阅读一个更具体的证据来证明为什么这个假设成立或不成立。
相关文章:
- 空基优化子对象的地址
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 如何在C++中获取该对象的类声明中对象的地址?
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 已转换对象的地址
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- 为什么按值返回的对象与方法中的对象具有相同的地址?
- 这个指针指向给定的对象还是给定对象的地址
- 对象地址是否保证是其类型对齐的倍数
- C++多态性:有没有办法找到对象成员函数的地址?
- 如何在 c++ 中操作当前对象的地址?
- static_casting基对象的地址到派生类的指针
- 如果我有指向基类对象的指针,如何获取虚拟方法的地址?
- 更改保留指向其字段的原始指针的对象地址
- 在 std::map 中插入对象时构造函数中变量的地址
- C++:获取包含成员子对象的完整对象的地址