13

Cのポインタ変数のサイズが依存している要因を理解するのが難しいと感じています。いくつかの参照を確認しましたが、これまでに取得した情報は、サイズがプロセッサアーキテクチャpointerに依存していることだけです。次の詳細を知りたいです。

  • アーキテクチャがポインタサイズにどのように影響するかについて詳しく説明してください。
  • 一般に、ポインタがの場合、x bitsアドレスの場所の数がそこにあるはずです。アドレスの場所の数とプログラムで使用可能な実際のメモリ量0 to 2^(X)-1を関連付けている間、私は道に迷っています。
4

3 に答える 3

10

ポインタは、別のメモリ位置のアドレスを保持する変数です。

これで、32ビットアーキテクチャで実行している場合、メモリ参照を保持するCPUのレジスタ(およびほとんどの場合、他のすべてのレジスタも)は32ビット長になります。これは基本的に32ビット(レジスタは32ビットワード長)の意味であり、したがってポインタ(メモリ位置)は通常32ビット長(4バイト)になります。

同じことが64ビットCPUにも当てはまります。したがって、64ビットCPU用にコンパイルされたCプログラムのポインターは、通常8バイトの長さ(64ビット)になります。

編集:
ほとんどの最新のアーキテクチャでは、コードで物理メモリに実際に対処していないことにも注意してください。仮想メモリと呼ばれるものを実行して対処します。

基本的な概念は、CPU / OSの組み合わせが、完全なアドレス空間を持っていることをプログラムに示しているということです。

繰り返しますが、アドレス空間(メモリ内でアドレス指定できるスペース)の長さは、CPUが場所をアドレス指定できる距離に依存し、(一般的な場合)そのワードサイズに依存します。

于 2012-10-28T14:36:15.793 に答える
4

ポインタのサイズは多くの要因(ハードウェア、オペレーティングシステム、コンパイラなど)に依存し、同じプラットフォーム上のすべてのポインタタイプが同じサイズであるとは限りません。たとえば、ハーバードアーキテクチャを使用する組み込みプロセッサがあり、コードとデータは別々のメモリ領域にあり、それぞれが異なるバスサイズ(たとえば、データ用に8ビット、コード用に16ビット)を持つ場合があります。つまり、オブジェクトポインタ(、、int *)は8ビット幅である可能性がありますがchar *double *関数ポインタ(int (*)())は16ビット幅である可能性があります。

別の例として、メモリの基本単位が8ビットバイトではなく、より大きな単位(幅が16、18、24、32、36、64、または128ビットになる可能性がある)であるワードアドレスアーキテクチャについて考えてみます。 、またはその他の値。2の累乗は便利であることが証明されていますが、必須ではありません)。これらのアーキテクチャの一部は、複数のchar値を1つのワードにパックすることを選択する場合があります。つまりchar *、ワードへのオフセットを指定するには、いくつかの追加ビットが必要です。

著書C:A Reference Manualで、Harbison&Steeleは36ビットワードのアーキテクチャについて説明しています。文字データは7ビットのASCII値として保存されました。つまり、各単語は1ビットを使用せずに5文字を保持できます。他のすべてのタイプは完全な単語を取り上げました。

于 2012-10-28T20:10:57.853 に答える
0

Cのポインター変数のサイズが依存する要因を理解するのが難しいと感じています。いくつかの参照を確認しましたが、これまでに取得した情報は、ポインタのサイズがプロセッサアーキテクチャに依存していることだけです。32ビットマシンでは4バイト、64ビットマシンでは8バイトです。以下の詳細を知りたいのですが

これは必ずしも当てはまるわけではありませんが、とにかく、ポインタのサイズが仮想アドレスのアドレスを保持していることを理解する必要があります(それをサポートするOS上で)。したがって、ポインタのサイズはメモリバスの幅によって異なります。そのため、アーキテクチャはポインタのサイズに影響を与えます。常に当てはまるわけではないことに注意してください。たとえば、すべてのポインタのサイズが同じではない場合があります。

于 2012-10-28T14:42:06.943 に答える