2

sizeof16ビットと32ビットのシステムでポインターが何を返すか知りたかっただけです

printf("%d", sizeof(int16 *));
printf("%d", sizeof(int32 *));

ありがとうございました。

4

2 に答える 2

3

簡単な回答: 32 ビット Intel 386 では、これらが 4 を返す可能性がありますが、16 ビット 8086 をターゲットにすると、選択したメモリ モデルに応じて 2 または 4 が表示される可能性が高くなります。

詳細

最初の標準 C は、ポインターについて特別なことを要求していません。指定された変数を「指す」ことができる必要があり、ポインター演算は指定された変数のデータ領域内で機能する必要があるだけです。ポインターのエキゾチックな表現を持つ C インタープリターでさえ可能であり、この柔軟性を考えると、ポインターはターゲットに応じて実際に任意のサイズになる可能性があります。

ただし、通常、コンパイラはメモリアドレスでポインターを表現するため、C標準で定義されていないいくつかの操作が「通常は機能する」ようになります。コンパイラーがポインターを表現する方法を選択する方法は、対象となるアーキテクチャーによって異なります。コンパイラーの作成者は明らかに、有用で効率的な表現を選択しました。

有用な表現の例は、Harward アーキテクチャ マイクロのジェネリック ポインターです。コードとデータ RAM の両方にアドレス指定できます。8 ビット マイクロでは、1 つのタイプ バイトと 2 つのアドレス バイトとしてエンコードされる可能性があります。

これは効率的な表現の良い例です。特定のポインタを持たないのはなぜでしょうか? 1 つはコード メモリを指し、もう 1 つはデータ メモリを指しますか? わずか 2 バイト (8051 などの 8 ビット マイクロでは通常のように 16 ビット アドレス空間を想定) であり、タイプごとに選択する必要はありません。

しかし、その後、複数のタイプのポインターがあります (8051 の場合も同様です: 内部 RAM 内を指しているポインターの追加のタイプが少なくとも 1 つある可能性があります...)。次に、プログラマーは、使用する必要がある特定のポインター型について考える必要があります。

もちろんサイズも違います。8051 をターゲットとするこの架空のコンパイラでは、3 バイトのジェネリック ポインター型、2 バイトの外部データ メモリ ポインター型、2 バイトのコード メモリ ポインター型、および 1 バイトの内部 RAM ポインター型があります。

また、これらはポインターのタイプであり、ポインターが指すデータのタイプではないことに注意してください(ポインターが関数ポインターであるという事実は、データポインターとは異なるタイプであることを意味するため、関数ポインターはここでは少しずれています。それが指すデータ型が関数型であることを除いて、特定の構文の違い)。

8086 であると仮定して、16 ビット マシンに戻ります。

コンパイラが 1 つのデータ セグメントを持っていると想定するメモリ モデルを使用する場合、nearまたはfar. それ以外の場合、デフォルトで 4 バイトのポインターが取得されます。2 バイト ポインターの表現は、通常、単純に 16 ビット オフセットですが、4 バイト ポインターの場合は、セグメント:オフセットのペアです。nearor指定子をいつでも適用しfarて、ポインターを明示的に 1 つまたは別の型にすることができます。

(nearポインターも使用するプログラムでポインターはどのように機能するのfarでしょうか?単純に、コンパイラーによって生成されたデフォルトのデータセグメントがあり、すべてnearの s がその中に配置されています。コンパイラーは、単純に永久に、または少なくともほとんどの場合、dsセグメントレジスターを持っている可能性がありますデフォルトのデータセグメントで満たされているため、nears が指すデータへのアクセスが高速になります)

于 2013-07-30T18:40:44.050 に答える
-3

a ポインターのサイズは、アーキテクチャーによって異なります。正確には、メモリにアクセスするためのバスシステムのサイズを反映する、そのアーキテクチャで使用されるアドレスのサイズに依存します。

たとえば、32 ビット アーキテクチャでは、アドレスのサイズは 4 バイトです。

sizeof (void *) == 4 Bytes. 

64 ビットでは、アドレスのサイズは 8 バイトです。

sizeof (void *) == 8 bytes. 

すべてのポインターは、型と相互に依存して同じサイズであることに注意してください。したがって、コードを実行すると、int16ポインターのサイズとint32ポインターのサイズは同じになります。

ただし、16 ビット システムでのポインタのサイズは 2 バイトである必要があります。通常、16 ビット システムのメモリは非常に少なく (数メガバイト)、すべての場所をアドレス指定するには 2 バイトで十分です。より正確に言うと、16 ビットのポインターでは、使用できる最大メモリは約 65 KB です。(今日のコンピューターのメモリ量と比較すると、実際にはほとんどありません)。

于 2013-07-30T16:15:48.393 に答える