2012-08-02 5 views
85

それはC language.Itがいることを書かれている:の意味は何である "__attribute __は((パック、整列(4)))"

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

はそれの意味は何で教えてください、そしてどのようにこのキーワードを使用する。

+4

を使用してスタックするアライメント値をプッシュすることができます。 org/onlinedocs/gcc/Type-Attributes.html)(Googleで "C属性がパックされている"ということがわかりましたが、確かに他の人は少なくとも良いことをすることができます) –

+1

[この質問を参照](http:// stackoverflow。 com/q/8568432/827263) - 'aligned(4)'ではおそらくあまり心配する必要はありません。 –

答えて

102

で割り切れるアドレスに整列されなければならないことを意味し、私はあなたのWiki

からいくつかのデータ

データ構造のアライメントをさせていただきたいと思いデータがコンピュータメモリに配置されアクセスされる方法です。これは2つの別々の、しかし関連する問題:データアライメントデータ構造のパディングから構成されます。

最新のコンピュータがメモリアドレスを読み書きする場合、これはワードサイズのチャンク(32ビットシステムの4バイトチャンクなど)で行います。 データ整列は、ワードサイズの倍数に等しいオフセットでデータを格納することを意味し、CPUがメモリを処理する方法によりシステムのパフォーマンスを向上させます。データを整列させるために

データ構造パディングであり、最後のデータ構造の終わりと次の開始との間のいくつかの無意味なバイトを挿入する必要があるかもしれません。


gccは構造体の埋め込みを回避する機能を提供します。すなわち、場合によってはこの無意味なバイトを避ける。

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

}sSampleStruct; 

sizeof(sSampleStruct)次のような構造を検討しているため、構造体のパディングの12ではなく8になります。デフォルトでは、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の累乗でなければなりません。here

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

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

を参照してくださいので、上記の指定されたgccの属性は、構造体のパディングを許可していません。サイズは8バイトになります。 //gcc.gnu:あなたはすべての構造のために同じことをしたい場合は

は、単に我々はそれが[「type属性」](HTTPだ#pragma

#pragma pack(push, 1) 

//Structure 1 
...... 

//Structure 2 
...... 

#pragma pack(pop) 
+5

メモリが4バイトのチャンクにデータを格納する場合、なぜ2バイトのパディングバイトを符号なしのshort(2バイト長)に追加しないのですか?またはコンパイラは構造の最初と最後のメンバーにパディングバイトを追加するだけですか?あなたはそれを明確にしていただけますか? – User

+3

@ User Plzもこれを参照しています。あなたがまだクリアされていない場合、plzは助けに来るhttp://stackoverflow.com/questions/11772553/why-padding-is-not-happening-in-this-case – Jeyaram

58
  • packedそれはstruct Ballのために可能な限り小さなスペースを使用することを意味します - 任意のstruct Ballのために、すなわち、そのアドレスをすることができます - それはパディング
  • alignedせずに一緒にフィールドを詰め込むます。すなわち、各struct Ballは4バイト境界で始まることを意味します4で割った

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

8

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

aligned(4)は、構造体が答える前に4

関連する問題