1

int生のメモリアドレスの値を解釈する必要がある場所で何かを行っています.本質的に、整数型よりも大きい値がどのように格納されているかを見つけようとしています.

この議論のために、レジスタ サイズが 32 ビット、int が 32 ビット、long が 64 ビットの 32 ビット アーキテクチャを想定してみましょう。2 つのレジスタ値がどのように整列されるかについて、経験則やガイドラインはありますか?

「アーキテクチャ/OS/言語に依存する」という議論を邪魔にならないようにしましょう。この分野では、リモートで移植可能または標準化されているものは何もないことを認識しています (実際、意図的に標準で指定されていません)。ここに一般的なパターンがあるかどうかに興味があります。私は誰も撃ちません。どんな回答でも、私のハード ドライブが消去される可能性があります。標準的な注意事項です。私はただ興味があります。

たとえば、構造体のパッキングと、アドレス境界に収まるよりもスペースが少ない場合にコンパイラが (通常) 型が正しく整列されるようにする方法については十分に理解していますが、アドレス境界よりも大きい場合はどうなりますか?

合理的なレイアウトをいくつか見ることができます。

0x10アドレスを使用して値0x11を保存していると仮定するとlong、99 はわかりません。ここでいくつかの用語を作成しlowintますhighint

レイアウトが0x10 => lowint,の場合、タイプがまたはのいずれかであり、MAX_INT をオーバーフローしない場合0x11 => highint、 を読み取ると0x10一貫した値が得られます。これは優れた機能です。どちらの場合も「99」です。また、ベース アドレスの上方にある2 つのアドレスも取得します。一方、低域と高域は「反転」しているように見えます。intlong0x10

レイアウトが0x10 => highintの場合0x11 => lowint、高い部分と低い部分は順番に並んでいますが、 を読み取ると、0x10int の場合は "99"、long の場合は "0" になります。0x11たとえば、2 つの int ではなく、1 つの long を扱っているということです。私たちはまだ上向きに成長しています。

レイアウトが の場合、0x10 => lowint0x0F => highint方向に拡張されています (つまり、ストレージの 2 番目の int を取得するために奇妙な前のアドレスを使用しています) が、int は適切であり、読み取りは0x10データ型全体で一貫しています。これは、キャッシュとデータラインの読み取りを完全に台無しにする可能性が最も低いように思えますが、それでも別のオプションです。

では、何が最も可能性が高いでしょうか?私の直感では、オプション 2 (2 つの int のストレージ スペースを備えた順序で並べられた高低部分) がハードウェアにとって最も便利であることがわかりますが、これが真実であるとは確信が持てません。レイアウトに関する逸話的な証拠を持っている人はいますか?

4

2 に答える 2

2

ここで求めているのは、endianess に関するものです。ビッグ エンディアン、リトル エンディアン、ミックス エンディアンは、コンピューター アーキテクチャの主要な問題であることが判明しました。あなたが言及した最初のもの(つまり、lowintとして0x10)はリトルエンディアンとして知られており、2番目のものはビッグエンディアンです。

ロードされる方向について混乱する必要はありません。0x10 から 16 ビットをロードすると、エンディアン スキームに関係なく、0x10 と 0x11 から 2 バイトが取得されます。ポインターが下向きになることはめったにないため、私の経験では、最後の例は決して発生しません。

プロセッサが上位バイトと下位バイトを解釈する方法 (エンディアン) によってメモリへの格納方法が決まるため、レジスタは重要です。アーキテクチャ間で移動される特定のデータ構造に依存する移植可能なソフトウェアでは、プロセッサのエンディアンが操作中のデータ構造のエンディアンと異なる場合、バイト順序を逆にする必要があります。

于 2012-08-19T22:17:01.870 に答える
1

2 つのレジスタ値がどのように整列されるかについて、経験則やガイドラインはありますか?

アラインメント (エンディアンなど) はメモリの問題です。レジスターとは関係ありません

于 2012-08-19T22:08:30.940 に答える