int
生のメモリアドレスの値を解釈する必要がある場所で何かを行っています.本質的に、整数型よりも大きい値がどのように格納されているかを見つけようとしています.
この議論のために、レジスタ サイズが 32 ビット、int が 32 ビット、long が 64 ビットの 32 ビット アーキテクチャを想定してみましょう。2 つのレジスタ値がどのように整列されるかについて、経験則やガイドラインはありますか?
「アーキテクチャ/OS/言語に依存する」という議論を邪魔にならないようにしましょう。この分野では、リモートで移植可能または標準化されているものは何もないことを認識しています (実際、意図的に標準で指定されていません)。ここに一般的なパターンがあるかどうかに興味があります。私は誰も撃ちません。どんな回答でも、私のハード ドライブが消去される可能性があります。標準的な注意事項です。私はただ興味があります。
たとえば、構造体のパッキングと、アドレス境界に収まるよりもスペースが少ない場合にコンパイラが (通常) 型が正しく整列されるようにする方法については十分に理解していますが、アドレス境界よりも大きい場合はどうなりますか?
合理的なレイアウトをいくつか見ることができます。
0x10
アドレスを使用して値0x11
を保存していると仮定するとlong
、99 はわかりません。ここでいくつかの用語を作成しlowint
ますhighint
。
レイアウトが0x10 => lowint
,の場合、タイプがまたはのいずれかであり、MAX_INT をオーバーフローしない場合0x11 => highint
、 を読み取ると0x10
一貫した値が得られます。これは優れた機能です。どちらの場合も「99」です。また、ベース アドレスの上方にある2 つのアドレスも取得します。一方、低域と高域は「反転」しているように見えます。int
long
0x10
レイアウトが0x10 => highint
の場合0x11 => lowint
、高い部分と低い部分は順番に並んでいますが、 を読み取ると、0x10
int の場合は "99"、long の場合は "0" になります。0x11
たとえば、2 つの int ではなく、1 つの long を扱っているということです。私たちはまだ上向きに成長しています。
レイアウトが の場合、0x10 => lowint
逆0x0F => highint
方向に拡張されています (つまり、ストレージの 2 番目の int を取得するために奇妙な前のアドレスを使用しています) が、int は適切であり、読み取りは0x10
データ型全体で一貫しています。これは、キャッシュとデータラインの読み取りを完全に台無しにする可能性が最も低いように思えますが、それでも別のオプションです。
では、何が最も可能性が高いでしょうか?私の直感では、オプション 2 (2 つの int のストレージ スペースを備えた順序で並べられた高低部分) がハードウェアにとって最も便利であることがわかりますが、これが真実であるとは確信が持てません。レイアウトに関する逸話的な証拠を持っている人はいますか?