1. ホーム
  2. c

[解決済み] 属性__((packed, aligned(4))) の意味を教えてください。"

2022-05-10 14:31:55

質問

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)