この回答int*
には、「が a より小さいマシン上で」という興味深い記述がありchar*
ます。(関数へのポインタを除外しましょう)
異なる型へのポインタが異なるサイズを持つことは可能ですか? なぜこれが役立つのでしょうか?
この回答int*
には、「が a より小さいマシン上で」という興味深い記述がありchar*
ます。(関数へのポインタを除外しましょう)
異なる型へのポインタが異なるサイズを持つことは可能ですか? なぜこれが役立つのでしょうか?
はい、それは完全に可能です。一部のマシンでは、バイトへのポインタに 2 つの値が含まれます。バイトを含むメモリ ワードの WORD アドレスへのポインタと、ワード内のバイトの位置を示す「バイト インデックス」です。たとえば、32 ビット マシンでは、「バイト インデックス」は 0..3 です。
これには、関連する単語への単なるポインターである「int *」よりも多くの記憶域が必要になります。
ワード アドレスのマシンでchar*
は、 にパート ワード情報を含める必要がある場合があり、int*
.
標準ではこれを許可していますが、そのようなハードウェアでの実装を除外するものではありません (C89 が設計されたときよりもさらにまれではありますが)。
language-lawyerタグは、特定の物理マシンではなく、C++ とその準拠の実装について質問していることを意味します。
それを証明するには、標準全体を引用する必要がありますが、単純な事実は、sizeof(T*)
for anyの結果を保証するものではなく、(当然の結果として) for anyおよび) をT
保証しないということです。sizeof(T1*) == sizeof(T2*)
T1
T2
int
配列に必要なメモリが配列に必要なメモリよりもはるかに少なくなると想定するのが理にかなっているマシンを想像できchar
ます。
たとえば、10 個を超える動的に割り当てられた整数を使用しない実装を指定できますが、多くのchar
配列を自由に割り当てることができます。この場合、 は 1 バイトで十分ですが、は 4 バイト以上でint*
ある必要があります。char*
それは理論的なビジョンです。