web-dev-qa-db-ja.com

「__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;

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

106
Aaron Lee

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


データ構造のアラインメントは、コンピューターのメモリ内でデータが配置およびアクセスされる方法です。 data alignmentdata structure paddingの2つの別個の関連する問題で構成されています。

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

データを揃えるには、最後のデータ構造の終わりと次のデータ構造の始まりの間に無意味なバイトを挿入する必要があるかもしれません。つまり、data structure padding


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;

__attribute__((packed, aligned(X)))を使用して、特定の(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)
135
Jeyaram
  • packedは、struct Ballに使用可能な最小のスペースを使用することを意味します-つまり、パディングなしでフィールドを詰め込みます
  • alignedは、各struct Ballが4バイト境界で始まることを意味します-つまり、struct Ballの場合、そのアドレスは4で割ることができます

これらはGCC拡張機能であり、C標準の一部ではありません。

74
cnicutar

属性packedは、コンパイラがstructのフィールド間にパディングを追加しないことを意味します。パディングは通常、フィールドを自然なサイズに揃えるために使用されます。これは、一部のアーキテクチャでは、揃えられていないアクセスに対してペナルティを課すか、まったく許可しないためです。

aligned(4)は、構造体を4で割り切れるアドレスに揃える必要があることを意味します。

13