web-dev-qa-db-ja.com

64ビットプロセッサ(Intel i3 / i5 / i7)のメモリ内の変数のアドレスのサイズはいくつですか?

それは64ビットアドレスですか、それともまだ32ビットですか、それとも誤ってアドレスを読み取った可能性があるため、アドレスは48ビットですか?または、Intelは1つのセルの32ビットアドレスと別の32ビットセルの半分を使用して48ビットを作成しますか?では、変数に単一のcharポインターを使用すると、アドレス自体のサイズ(0xFFEDEDAC)は4バイトになりますか?

1
Vikki

最新のオペレーティングシステムで実行されているコードで使用されるアドレスである仮想アドレスと、「ロングモード」で実行されているプログラムについて話している場合、アドレスは通常64ビット(8バイト)で格納されます。ただし、アーキテクチャ仕様では、下位48ビットのみが実装されています。残りの16ビット(ビット48から63)は、実装されたビットの最上位であるビット47のコピーである必要があります。

これにより、一見したところ、0x00000000'00000000から0xFFFFFFFF'FFFFFFFFまでのアドレス空間が作成されます。ただし、実際に使用できるアドレスは、次の範囲のアドレスのみです。

0x00000000'00000000 through 0x00007FFF'FFFFFFFF
0xFFFF8000'00000000 through 0xFFFFFFFF'FFFFFFFF

これにより、理論上のアドレス空間は2〜64バイト(16エクスビバイト、つまり約18x10 ^ 18)になります。もちろん、これらの数値は32ビットプロセッサの数値の2乗です。ただし、実際に実装されるのは256 ^ 48バイトのみで、後者はそれぞれ128TiBの2つの同じサイズの半分に分割されます。

(Windowsのユーザーモードは前半を使用し、これはすべてのプロセスに対して新たにインスタンス化されます。カーネルモードは後半を使用します。これは主にすべてのプロセスに共通です。)

ちなみに、メモリには64ビットまたは32ビットの「セル」はありません。バイトしかありません。 x86/x64はバイトアドレス指定可能です。

特定の例では、ポインタはメモリ内で8バイトを占有します...互換モードで32ビットプログラムを実行している場合を除き、互換モードでは4バイトを占有します。

2
Jamie Hanrahan