3

私はARMを使用しています。奇数オフセットでの読み取り/書き込みが原因でアライメント エラーが発生しました (ARM が 4 バイトでアライメントされていることはわかっていました)。私のプログラムで定義されているすべての構造体は、次のように1バイトで整列されています

#pragma pack(push, 1)    

typedef struct
{
   char a1;
   int  a2;
   char a3;
}a;

#pragma pack(pop)

私はやろうとしています

#pragma pack(push, 1)

typedef struct
{
    char a1 __attribute__ ((aligned (4)));
    int  a2;
    char a3;
}a;

#pragma pack(pop) 

gcc attribute _ attribute _ ((aligned (4)))は効果がありません。

Note :: The above code is not my actual code. sample scenario. 


そのため、アライメントの問題を解決するために構造体メンバーを再配置しました。再配置が可能な解決策であるか、または_ attribute _をこのシナリオで機能させることができるかを確認したい. 他のソリューションは大歓迎です。前もって感謝します。

4

1 に答える 1

1

ARM では、バイト アラインされた構造体で char/int を安全に読み書きできます。コンパイラはアラインメントを処理します。アライメントの問題で発生する可能性のある単一の問題は、次のような 32 ビット int へのキャストです。

char buf[5];
char *p = buf + 1;
*((int *)p) = 1;

注: いくつかのメンバーを (構造体の先頭から) 揃えるなどの理由がある場合は、次のトリックを使用できます。

typedef struct {
    struct {} __attribute__ ((aligned (4)));
    char a1; // offset is 4
    int  a2; // offset is 5
    char a3; // offset is 9
} a;
于 2012-07-19T10:08:45.210 に答える