それは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;
その意味と、このキーワードの使い方を教えてください。
それは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からいくつかのデータを提供したいと思います
データ構造の整列とは、データがコンピューターのメモリに配置されアクセスされる方法です。これは、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
。一部のアーキテクチャでは、境界整列されていないアクセスにペナルティを課したり、まったく許可しないため、パディングは通常、フィールドを自然なサイズに揃えるために使用されます。
aligned(4)
これは、構造体を4で割り切れるアドレスに揃える必要があることを意味します。