4

次のコードフラグメントがあります。

  char *chptr;
  int *numptr;

  printf("\nSize of char is %d\n",sizeof(chptr));
  printf("\nSize of int is %d\n",sizeof(numptr));

次の出力を取得しました。

Size of char is 4
Size of int is 4   

明らかに、ポインターは2 32 - 1までのアドレスを格納できます。

Windows 7 32-bitとでオペレーティング システムを使用しCode::Blocks 10.05ていMingWます。

しかし、私のシステムにPentium Dual-Core36 Bit Address Bus. 現在、4 GBのRAMがあります。しかし、RAM のサイズを増やして、「C ポインターは、このように拡張されたアドレス空間をどのように処理できるでしょうか?」と言うと8 GBます。C ポインターのサイズはわずか 32 ビットですが、アドレス空間は 2 32をはるかに超えています。

助言がありますか?前もって感謝します。

PS: ポインターのアドレスストレージを扱うここでの回答を確認しましたが、私の質問はカバーされていません。

4

3 に答える 3

4

ポインターが使用するアドレスは、物理アドレス空間ではなく、仮想アドレス空間にあります (最新の O/S を使用していると仮定します。質問では言いません)。

O/S カーネルは、必要に応じて仮想メモリ ページを物理アドレス ページにマップし、ユーザー プロセスが意識することなくメモリ システム全体を管理します。

32 ビットの O/S を使用している場合、アドレス指定するユーザー アドレス空間がおそらく 2GB ありますが、これは 64 ビットの O/S に移行すると劇的に増加します。

このウィキペディアの仮想メモリに関する記事を確認してください。

于 2013-04-23T12:25:51.667 に答える
1

いくつかのヒント:

  1. OS が 32 ビットか 64 ビットかを確認します。
  2. コンパイラが 64 ビット ポインターを生成できるかどうかを確認します。
  3. コンパイラに 64 ビット ポインター用の追加のデータ型があるかどうかを確認します。
  4. コンパイラにキーワードなどの C 言語への拡張機能があるかどうかを確認しfarます__far
于 2013-04-23T12:32:57.047 に答える
1

C ポインターが 8 GB を処理するための最も簡単な解決策は、コードとデータを再度分離することです。4 GB のコードと 4 GB のデータを使用できるため、合計で 8 GB になります。0x00010000とにかく、コード ポインターとデータ ポインターを合法的に比較することはできませ0x00010000ん。

しかし現実的には、解決策は 64 ビットに移行することです。36 ビット ハックは役に立ちません。現在、128 GB の RAM は完全に可能です。

于 2013-04-23T12:50:07.100 に答える