sizeof(long) は 8 バイトを返しますが、&along (long のアドレス) は 12 桁の 16 進数 (48 ビット) または 6 バイトです。clang でコンパイルされた OS X 64 ビット。ここに不一致がありますか、それとも本物の 64 ビット アドレス空間ですか?
4 に答える
あなたは2つの異なる概念を混同していると思います。Sizeof は、アドレスの長さではなく、long の長さを示します。long は 6 バイトのメモリを必要としますが、それへのポインタは (明らかに) 6 バイトしか必要としません (または、より可能性が高いのは 8 バイトですが、メモリのレイアウト方法のために最初の 2 つはすべてゼロです)。
アドレス空間について少し説明を加えましょう。ポインタは 64 ビット プロセッサでは 8 バイトの長さですが、アドレス空間はほとんど必要ありません。これにより、必要以上に 2^64 バイトをアドレス指定できます。したがって、簡単にするために、多くのプロセッサとコンパイラはこれらのビットのうち 48 ビットしか使用しません。いくつかの有用な図については、このウィキペディアのリンクを参照してください。
http://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses
アドレスはメモリの場所です。32 ビット システムでは 32 ビット、64 ビット システムでは 64 ビットなどになります。
sizeof
of 変数は、それが占有するメモリ量です。全く関係のない数字です。
sizeof(long) は 8 バイトを返しますが、&along (long のアドレス) は 12 桁の 16 進数 (48 ビット) または 6 バイトです。
はい、数値を印刷するときに先頭の 0 が印刷されないためです。例えば:
int x = 0x0000000F;
printf( "%X", x );
// prints "F"
これが正確な理由かどうかはわかりませんが、現在の 64 ビット プロセッサには通常、実際には 64 ビット アドレス空間がありません。48 ビットのアドレス空間は、私が生きている間に必要になると予想される量を超えているため、余分なハードウェアが必要になるのは無駄です。アドレスの切り捨てられたバージョンが表示されている可能性があります (つまり、アドレスの前にゼロが埋め込まれていません)。