C/C++で参照される下位原理
6597 ワード
私たちが見た解釈の大部分はこう言っています参照は変数の別名 である.参照非占有スペース 参照とポインタの違いblablabla... 引用いったいスペースを占有していないのか、占有すると何が保存されているのか.
まず、引用アドレスについて何が起こるか見てみましょう.
参照に対してアドレスを取るのは、実際には参照対象に対してアドレスを取るので、それは通用しないことがわかります.
しかし,アドレスオフセットにより間接的に実現できる.
出力に基づいて以下の情報をまとめることができます. intタイプの占有空間サイズは4バイト、int*タイプの占有空間サイズは8(64ビット) である. Testオブジェクトの占有空間の大きさが16であるのはメモリの位置合わせのためで、4+8は8+8 になった.上記の2つの結論から、引用占有空間は、ポインタ占有空間と同様に大きい であることが分かる.最後の2つの出力から、参照に格納値が参照変数のアドレス であることがわかる.
参照ポインタですか?
下位実装から言えば、参照はポインタによって実現され、下位はポインタである.のこの検証は,c++における「参照」の下位実装原理の詳細を参照できる.
しかし、なぜ参照をポインタのように操作できないのでしょうか.
実はほとんどのブログや教材で言われているように、引用の登場は開発者たちが引用を変数の別名として使ってほしいということで、具体的にどうすればいいのか、私にはわかりません.
まず、引用アドレスについて何が起こるか見てみましょう.
#include
int main() {
int a = 10;
int &b = a;
printf("%x
%x
", &a, &b);
return 0;
}
//
e99a7dec
e99a7dec
参照に対してアドレスを取るのは、実際には参照対象に対してアドレスを取るので、それは通用しないことがわかります.
しかし,アドレスオフセットにより間接的に実現できる.
#include
class Test {
public:
int a = 10;
int &b = a;
};
int main() {
Test t, *pt = &t;
printf("sizeof int is %d.
", sizeof (int));
printf("sizeof Test is %d.
sizeof (int *) is %d.
", sizeof t, sizeof (int *));
printf("%x---%d
", pt, *pt);
int *ptt = (int *)pt; // , int* ,
printf("%x---%x
", ptt - 2, *(ptt - 2)); //
return 0;
}
//
sizeof int is 4.
sizeof Test is 16.
sizeof (int *) is 8.
24cb9ff0---10
24cb9fe8---24cb9ff0
出力に基づいて以下の情報をまとめることができます.
参照ポインタですか?
下位実装から言えば、参照はポインタによって実現され、下位はポインタである.のこの検証は,c++における「参照」の下位実装原理の詳細を参照できる.
しかし、なぜ参照をポインタのように操作できないのでしょうか.
実はほとんどのブログや教材で言われているように、引用の登場は開発者たちが引用を変数の別名として使ってほしいということで、具体的にどうすればいいのか、私にはわかりません.