您写道您想找到内存偏移量。虽然 FredOverflow 所写的完全正确,但Test
如果您想知道 和 的地址,a
您应该创建一个类的实例。例如:b
c
Test t;
float *ptr = &t.a;
float *ptr1 = &t.b;
float *ptr2 = &t.c;
在我的机器上,这会产生以下三个地址:
0x7fff564f8918
0x7fff564f891c
0x7fff564f8920
您会注意到它们sizeof(float)
相隔 4 个字节(或 ),并且 a 的大小Test
为 12 个字节(使用sizeof(Test)
)。此外, 的地址与 的&t
地址0x7fff564f8918
相同&t.a
。这就是类实例的内存布局是如何Test
形成的。
您还可以POD
使用 查找类型成员的偏移量offsetof()
。
cout << offsetof(Test, a) << endl;
cout << offsetof(Test, b) << endl;
cout << offsetof(Test, c) << endl;
产量
0
4
8
注意offsetof(Test, b)
本质上是一样的
(unsigned long long) &(((Test*) 0)->b) - (unsigned long long) (Test*) 0
回答您的后续问题:
由于与前面提到的相同的错误,该代码将不起作用。但是,如果您想计算y
成员的地址origin
并为其分配值0
,则可以这样做:
class Point3d {
public:
float x, y, z;
};
Point3d origin;
origin.y = 10;
// We take the address of origin, which points to the first member,
// then add the offset to the member y.
float *ptr = (float*) ((unsigned long long) &origin + offsetof(Point3d, y));
cout << "Old value: " << *ptr << endl;
*ptr = 0;
cout << "New value: " << *ptr << endl;
产生输出:
Old value: 10
New value: 0
再次记住,这只是可能的,因为Point3d
它是一种POD
类型。