「__attribute __((packed、揃った(4)))」の意味は何ですか


122

それは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;

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


4
それは「タイプ属性」です..(Googleで「C属性パック」でこれを見つけました。確かに他の人が少なくとも同じようにできるでしょう!)

1
この質問を参照してください-とはいえ、aligned(4)心配する必要はほとんどありません。
キース・トンプソン

回答:


157

回答する前に、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)

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

5
@User Plzもこれを参照します。あなたはまだ明らかでない場合は、plzのヘルプのために来stackoverflow.com/questions/11772553/...
Jeyaram

これらのパディングバイトが無意味であると誰が言ったとしても、不整合なデータアクセスがx86アーキテクチャの奇妙なものであることはわかりません。これらのバイトは、プロセッサが自然な配置境界をまたがるデータ(たとえば整数)をロードしようとするときに例外を回避するために必要です。
Tanveer Badar

86
  • packed可能な限り最小のスペースを使用することを意味します。struct Ballつまり、パディングなしでフィールドを詰め込みます
  • alignedそれぞれstruct Ballが4バイト境界で始まることを意味します。つまり、すべての場合struct Ball、そのアドレスは4で除算できます。

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


17

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.