1

jmorecfg.hから:

#define PACK_TWO_PIXELS(l,r)   ((r<<16) | l)
#define PACK_NEED_ALIGNMENT(ptr) (((int)(ptr))&3)
#define WRITE_TWO_PIXELS(addr, pixels) do {     \
         ((INT16*)(addr))[0] = (pixels);        \
         ((INT16*)(addr))[1] = (pixels)>>16;    \
    } while(0)
#define WRITE_TWO_ALIGNED_PIXELS(addr, pixels)  ((*(INT32*)(addr)) = pixels

誰かがWRITE_TWO_PIXELSとWRITE_TWO_ALIGNED_PIXELSの違いを説明できますか?ピクセルがスタックに割り当てられたuint32_tおよびaddr&3 == 0である場合、それらは同等ではないでしょうか?

ありがとう。

4

2 に答える 2

2

2つのマクロで重要なのは、の配置だけですaddraddr質問に書かれているように、が32ビットアラインされている場合(つまり、下位2ビットがゼロである場合)は同等ですが、ターゲットアーキテクチャもリトルエンディアンである場合に限ります。

ビッグエンディアンマシンでは、それらを同等にするために、の上位16ビットをに書き込み、下位16ビットをpixelsに書き込む必要があります。(INT16*)(addr))[0](INT16*)(addr))[1]

libjpegのソースコードのコピーを確認しなければ、これらの定義はライブラリの移植の一部として変更されることが予想されるか、エンディアンの宣言によってすでに保護されていると思います。

addrが32ビットにアラインされていない場合、アラインされていないアクセスが許可されていないアーキテクチャでは、マクロWRITE_TWO_ALIGNED_PIXELSによって例外がスローされる可能性があります。もちろん、場合によっては、非整列アクセスが許可されますが、2つの小さな整列アクセスよりもはるかにコストがかかります。他の一部のアーキテクチャでは、非整列アクセスと整列アクセスを区別するのが困難です。

2つのマクロは、ライブラリの作成者にアライメントについて考え、アライメントのずれたアクセスを処理するアプローチを標準化して、問題のないプラットフォーム向けに構築するときに最適化できるようにするために存在します。

于 2010-09-23T20:40:22.467 に答える
2

WRITE_TWO_PIXELSWRITE_TWO_ALIGNED_PIXELSリトルエンディアンのマシンでは同等ですが、ビッグエンディアンのアーキテクチャでは同等ではありません。

[編集例:SteveJessopに感謝]

ピクセル=0x0A0B0C0Dとします

ビッグエンディアンマシンの場合、次のようにWRITE_TWO_PIXELS機能します。

---------------------
| 0B | 0A | 0D | 0C |
---------------------
  3    2    1    0          <--- addr

ここでWRITE_TWO_ALIGNED_PIXELS次のように書きます:

---------------------
| 0D | 0C | 0B | 0A |
---------------------
  3    2    1    0          <--- addr
于 2010-09-23T20:44:33.333 に答える