Cポインターのサイズは何に依存しますか? データバスの幅ですか、アドレスバスの幅ですか、それともCPUのワードサイズですか?
ポインターは多くの場所をアドレス指定する必要があるため、アドレスバスの幅に依存する必要があると思います。私は正しいですか?
(もしあれば依存の理由を探しています)
Cポインターのサイズは何に依存しますか? データバスの幅ですか、アドレスバスの幅ですか、それともCPUのワードサイズですか?
ポインターは多くの場所をアドレス指定する必要があるため、アドレスバスの幅に依存する必要があると思います。私は正しいですか?
(もしあれば依存の理由を探しています)
ポインターのサイズは、コンパイラーの実装によって異なります。実際には、ほとんどの場合、構築対象のアーキテクチャのネイティブ ワード サイズです。
特に、C 言語標準では、さまざまな型へのポインターのサイズが異なる可能性があるため、プログラムとデータ メモリのサイズが異なるハーバード アーキテクチャをより適切にサポートできます。
問題の CPU アーキテクチャによって異なります。intptr_t
(C99 のみ)を使用して、これを考慮した移植可能なコードを記述できます。
一種の循環定義ですが、オブジェクトが配置されている場所を識別するために実装が使用するアドレス空間のサイズに依存します。これは、ハードウェア、OS、または C 実装者の気まぐれに依存する可能性があります。
したがって、実装で を格納する可能性のある場所が 65535 あることを望む場合、 に対してchar
(少なくとも) 16 ビットのポインターを使用しchar*
ます。40億程度(またはおそらくその半分、一部の実装ではポインターの最上位ビットを使用しない、または使用できない)、32ビット。64ビットのRAMよりもはるかに多くの場合。
実際には、決定は通常、実装がプログラムの実行を期待する OS によって制約されます。OS のメモリ割り当て関数が 64 ビット アドレスを返す場合、特定のケースで機能するハックがあるかもしれませんが、実装がより小さなポインター サイズを使用するのはかなり不便です。
実装が OS なしで実行される場合、実装が実行されるハードウェアのメモリ マップのサイズに適したサイズが使用されます。また、OS で実行する場合、OSはハードウェアに適したサイズを使用する可能性がありますが、必ずしもそうとは限りません。最新の 64 ビット OS には 32 ビット プロセスをサポートする習慣があり、その 32 ビット環境用にコンパイルされたプログラムを 64 ビット マシン上で実行すると、32 ビット ポインターが使用されるため、必ずしもそうとは言えません。ハードウェアに適したポインタ サイズは、同じハードウェアのワード サイズと同じである場合もあれば、異なる場合もあります。多くの場合、同じです。
最後に、一部の型は 1 バイトよりも大きいため、原則として、より大きな型に小さなポインターを使用することで何かが得られる可能性があり、標準ではこれが許可されています。8 ビット バイト、16 ビット整数、および 128k のアドレス指定可能なメモリを備えたマシンを想像してくださいint
。オブジェクトは 2 バイト アラインメントを持っています。その場合、achar*
は少なくとも 17 ビット (3 バイトのストレージを占める) であるint*
必要がありますが、原則として an は 16 ビット (2 バイトのストレージ) で十分です。 0 であるため、厳密に格納する必要はありません。実装がアドレスを常に正しく使用するように調整できる場合は、make が許可されますsizeof(int*) < sizeof(char*)
。実際には、これを行う人はほとんどいません。
ポインタのサイズは、プログラムがコンパイルされた CPU アーキテクチャによって異なります。
すべてのポインタはメモリ内で同じ量のスペースを占有しますが、ポインタのメモリ内のサイズは、コードがコンパイルされた CPU アーキテクチャによって異なります。