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