1

私のコンパイラは g++ 4.7.3 です

long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);

結果は

i=0xbfd78760 lref=0xbfd78760 iref=0xbfd78764

のアドレスirefがより高い理由i

私はそれがちょうどこのようになると思いconst int&ますlong:

int temp = i
const int& iref = temp;

================================================== ========

コード2

ただし、次のようなコードの場合

long i = 2222;
const long& lref = i;
const int& iref = i;
int a = 10;
int b = 10;

printf("i=%p lref=%p iref=%p a=%p b=%p\n", &i , &lref, &iref, &a, &b);

結果は

i=0xbfade768 lref=0xbfade768 iref=0xbfade774 a=0xbfade76c b=0xbfade770

aandのアドレスがスタックbよりも低いのはなぜですか?iref

================================================== ========

コード3

コードが好きなとき

long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);

結果は

i=0xbfbe3f84 lref=0xbfbe3f84 iref=0xbfbe3f83

のタイプが の場合、のアドレスが より小さいのirefはなぜですか?charirefi

誰かが私の理由を教えてくれませんか、ありがとう!

4

2 に答える 2

2

あなたの直感は正しく、iref実際には一時的に割り当てられた別のメモリの場所です。

メモリアドレスの順序はコンパイラ次第で、どうやらコード生成はスタックをこのように順序付けたようです。g++ が正確にこのように注文する理由はわかりません。おそらく、g++ 内部ドキュメントまたはソース コードのいずれかを深く掘り下げる必要があります。

ただし、ほとんどのシステムでは、スタックのアドレスが小さい場合、値がスタックの上位にあることを意味します。これは、通常、スタックが下に向かって成長するためです。

于 2013-08-23T12:26:11.503 に答える
0
long i = 2222;
const long& lref = i;

ここで、参照型はオブジェクト型と一致するためlref、 への参照にすることができますi。したがって、両方に同じアドレスが表示されます。

const int& iref = i;

ここでは、型が一致しないため、irefを直接参照できませんi。これによりエラーが発生すると予想される場合があります。ただし、言語には 2 つの抜け穴があります。

  • iタイプの一時に変換できますint。と
  • 定数参照は一時オブジェクトを参照できます (一時オブジェクトの有効期間を参照の有効期間に合わせて延長します)。

(おそらく驚くべき) 結果はiref、別のアドレスで別の値を参照することiです。

于 2013-08-23T12:49:11.790 に答える