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;
このキーワードの意味と使い方を教えてください。
答える前に、ウィキからいくつかのデータを提供したいと思います
データ構造のアラインメントとは、コンピューターのメモリ内でデータを配置してアクセスする方法です。これは、データの配置とデータ構造のパディングという 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;
__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)
packed
可能な限り最小のスペースを使用することを意味しますstruct Ball
-つまり、パディングなしでフィールドを詰め込みますaligned
は、それぞれstruct Ball
が 4 バイト境界で始まることを意味します。つまり、任意struct Ball
のアドレスは 4 で割り切れますこれらは GCC 拡張であり、C 標準の一部ではありません。
この属性packed
は、コンパイラが のフィールド間にパディングを追加しないことを意味しますstruct
。パディングは通常、フィールドを自然なサイズに整列させるために使用されます。これは、一部のアーキテクチャでは、整列されていないアクセスにペナルティを課したり、まったく許可しないためです。
aligned(4)
構造体を 4 で割り切れるアドレスにアラインする必要があることを意味します。