「__attribute__((packed,aligned(4)))」の意味は何ですか?質問する

「__attribute__((packed,aligned(4)))」の意味は何ですか?質問する

C言語です。次のように書かれています。

typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

このキーワードの意味と使い方を教えてください。

ベストアンサー1

答える前に、Wikiからいくつかのデータを紹介したいと思います。


データ構造のアライメントコンピュータのメモリ内でデータを配置し、アクセスする方法です。これは、2 つの別個ですが関連する問題から構成されます。データの配置そしてデータ構造のパディング

現代のコンピュータがメモリ アドレスを読み取ったり、メモリ アドレスに書き込んだりする場合、ワード サイズのチャンク (たとえば、32 ビット システムでは 4 バイトのチャンク) 単位でこれを実行します。データの配置データをワード サイズの倍数に等しいメモリ オフセットに配置することを意味し、CPU がメモリを処理する方法によりシステムのパフォーマンスが向上します。

データを整列させるために、最後のデータ構造の終わりと次のデータ構造の始まりの間に意味のないバイトを挿入する必要があるかもしれない。データ構造のパディング


gcc は、構造体のパディングを無効にする機能を提供します。つまり、場合によってはこれらの無意味なバイトを回避することができます。次の構造体を検討してください。

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

sizeof(sSampleStruct)8 ではなく 12 になります。これは構造体のパディングのためです。デフォルトでは、X86 では構造体は 4 バイトのアラインメントにパディングされます。

typedef struct
{
     char Data1;
     //3-Bytes Added here.
     int Data2;
     unsigned short Data3;
     char Data4;
     //1-byte Added here.

}sSampleStruct;

特定の(X)サイズのパディングを要求するために使用できます__attribute__((packed, aligned(X)))。Xは2の累乗である必要があります。ここ

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}__attribute__((packed, aligned(1))) sSampleStruct;  

したがって、上記で指定した gcc 属性では構造体のパディングは許可されません。したがって、サイズは 8 バイトになります。

すべての構造に対して同じことをしたい場合は、次のようにしてアライメント値をスタックにプッシュするだけです。#pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

おすすめ記事