あなたはメモリオフセットを見つけたいと書いていました。FredOverflow が書いていることは完全に真実ですが、 、およびTest
のアドレスを知りたい場合は、クラスのインスタンスを作成する必要があります。例えば:a
b
c
Test t;
float *ptr = &t.a;
float *ptr1 = &t.b;
float *ptr2 = &t.c;
私のマシンでは、これにより次の 3 つのアドレスが生成されます。
0x7fff564f8918
0x7fff564f891c
0x7fff564f8920
そして、それらが 4 バイト (またはsizeof(float)
) 離れており、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
ください。