1

間違っている部分がある場合は、事前に申し訳ありません。あまり混乱しない場合は、後で修正するために編集することがあります。

私が理解しているように、隣接するメモリで複数の変数が宣言されると、非常に低いレベルで、通常は 1、2、4、または 8 のバイト数をカプセル化するレジスタが作成されます。プロセッサによって数値として考えられるため、加算、減算、乗算、除算などの単純な数学で変更されます。

これらの範囲がオーバーラップしないという抽象化の理由があるかもしれませんが、多くの言語では、コーダーが認識できる明確に定義された順序で命令が発生すると見なされているため、割り当てられたメモリの隣接するバイトで 1 つ以上がオーバーラップしないパフォーマンス上の理由はありますか? ?

たとえば、すべてのビットが 0 から始まる割り当てられたメモリのブロックでは、バイト 0 から 3 を int として使用でき、バイト 1 から 4 も使用できます。 3.

そうでないパフォーマンス上の理由がある場合、まったく新しい変数に値をコピーしたり、完全に新しい変数から値をコピーしたり、より複雑なプロセスを実行して、そうでなければ非常に低いレベルで実行できる特定のアルゴリズムを達成したりする必要があるため、それらを克服できますか?

4

1 に答える 1

2

アセンブリで行われる場合、このトリックに問題はありません。オプティマイザは、CPU サイクルを節約し、コードのサイズを縮小するために、整数の部分がどこにあるかを知ることを日常的に利用しています。たとえば、32 ビット整数変数が 16 ビットにのみ収まる値に初期化される場合、最適化コンパイラは、32 ビット値をメモリに格納する命令を、16 ビット値をメモリに格納するより高速な命令に置き換えます。変数の下位ビットをクリアし、上位 16 ビットをクリアします。さらに、多くのオプティマイザはさらに進んでいます。定数が 2^16 で割り切れる場合、2^16 で割った値を上位 16 ビットに格納し、下位 16 ビットをクリアします。

一部のアーキテクチャでは、このような操作を特定のプロパティのアドレスに制限しています。たとえば、4 で割り切れるアドレスですべての 4 バイト メモリのロード/ストア命令を実行する必要があります。これらの制限により、部分的な値を書き込むトリックの適用性が低下する可能性があります。

于 2012-02-18T14:41:05.733 に答える