为什么类成员具有与其对象相同的地址
Why do class members have the same address as their object?
在以下情况下,每个成员都有不同的名称或实体,那么为什么它们的地址相同呢?
struct B { int x; };
struct A { B b; };
int main()
{
A obj;
cout << &obj.b.x << endl;
cout << &obj.b << endl;
cout << &obj << endl;
}
因为指向结构体的指针总是指向它的第一个成员(因为结构体是按顺序排列的)。
在C语言中,指向结构体的指针是否总是指向它的第一个成员?(C1x§6.7.2.1.13:"指向结构对象的指针,合适转换后,指向其初始成员…反之亦然。有可能在结构对象内填充,但不在其开始。")
注意: manage指出,如果你开始在结构体中添加虚函数,c++通过在结构体的开头添加虚函数表来实现这一点。这使得我的陈述(这对C来说是正确的)不正确,当你谈论你可以用c++中的"结构"做的一切。
因为它们在同一个地方。struct A
中的第一个元素是struct B
,因此它们实际上位于相同的内存位置(struct A
中的其他元素将放在b
之后)。
同样,x
是struct B
的第一个数据位,因此它与struct B
在相同的位置。
需要注意的是,这并不总是正确的。像虚函数这样的东西会导致物体移动。在这种情况下是正确的,因为它们是普通的类/结构。
如果你站在你的国家边境,手里拿着一杯咖啡,那么你的坐标,边界的坐标和咖啡杯的坐标在GPS设备上都是相同的值。
First子元素的第一个元素恰好位于对象的起始地址。名称是为了方便,计算机使用内存地址。你可以随意命名它们,但是内存布局取决于数据成员的顺序和层次。
相关文章:
- 空基优化子对象的地址
- 对象地址是否保证是其类型对齐的倍数
- 更改保留指向其字段的原始指针的对象地址
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 尝试将派生类对象地址分配给基类指针的向量
- 如果类型相同,对象地址必须不同,但如果类型不同,地址可以相同
- 使用对象地址以及方法地址和签名调用C 成员函数
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 为什么写入临时字符串流对象只打印对象地址
- 依赖静态对象地址安全吗
- 获取引用指向的对象地址
- 传递对象地址时"Address expression must be an lvalue or a function designator"
- 在C++中存储对象地址的数据结构
- 从函数初始化对象地址
- 使用reintepret_cast解释对象地址
- 为什么基类指针总是指向基类,即使它持有派生类对象地址
- 是否可以将堆栈对象地址赋给placement new
- <<运算符重载不起作用;仍在打印对象地址
- 关于返回对象地址的困惑