2

通常、short変数は 2 バイト アライン アドレスでなければなりませんが、奇数アドレスを指定しようとしても問題はありませんか?

このコードを VC++ 2008 で試してみましたが、正しく動作するので、その理由を説明していただけますか?

    unsigned char ca[10];
    unsigned short *s1 = 0;
    memset(ca, 1, 10);

    s1 = (unsigned short*)&ca[0];
    printf("s1 = %d\n", *s1);
    s1 = (unsigned short*)&ca[1];
    printf("s1 = %d\n", *s1);

上記のコード スニペットでは、ca[0]またはca[1]確かに奇数アドレスに 1 つあるため、2 バイト アラインメントではありませんが、と の両方にs1完全に割り当てられます。ca[0]ca[1]

では、このコードは正しく、この方法で実行することをお勧めしますか? ほとんどすべてのプラットフォーム/コンパイラでうまく機能するように、バイト配列内の任意の 2 バイトを短い変数として読み取る移植可能なメソッドが必要です。

どうもありがとうございました。

4

1 に答える 1

4

「しなければならない」というものはありません。それは、CPU ができること、またはできないことです。特に x86 は、おそらく「ミスアライン」アクセスを行うことができますが、効率が低下することはほぼ確実です。

他の CPU アーキテクチャへの移植性は、気にするものかもしれませんし、気にしないかもしれませんが、メモリ アクセスのミスアライメントは一般的に避けるべきです。さらに、コンパイラをだまして、位置合わせの悪いことをさせてしまうこともほとんどありません...「お願い、お願い、お願いします。でも、私は本当に自分の足を撃ちたいので、やらせてください」と懇願するように。通常、偶然にできることではありません。

于 2012-07-05T06:42:28.460 に答える