2012-03-28 7 views
6

私は、64ビットプラットフォーム上のuint32_tタイプのアライメントについて興味があります。 64ビットでuint32_tアラインメント?

> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t)); 
sizeof(uint32_t): 4 

しかし、私は、構造体を持っている::仕様は確かにそれがあるように思われ、のuint32_tは正確に与えられたビット幅であることを述べている

typedef struct A { 
    uint32_t a; 
    uint32_t b; 
} A; 

しかし、驚くほど:

> printf("sizeof(A): %zd\n", sizeof(A)); 
sizeof(A): 16 

何らかの理由でuint32_tが8バイト整列されていますか?それは本当に下に8バイトのタイプですか?

+1

コンパイラとは何ですか、アーキテクチャは何ですか? – ouah

+1

gcc 4.4.5 on x86-64 –

+0

配列の動作のために、 'uint32_t' *のアライメント要件は' sizeof(uint32_t) '以下でなければなりません。 'uintN_t'型では、' sizeof(uint32_t)* CHAR_BIT == 32'のようにパディングがないという要件があるためです。それ以外はC99に準拠していません。しかし、 'struct A'のアライメントは、C99によってどのメンバの最大アラインメントよりも大きくなることが許されています。 –

答えて

6

これは完全にあなたのコンパイラとアーキテクチャに依存します。あなたのケースでは、おそらくパフォーマンス上の理由から、フィールドが実際に8バイト整列されているかのように見えます。

2

私の推測では、デフォルトでは、64ビットアーキテクチャ上のすべてが32ビットアーキテクチャと同じ64ビット境界に揃えられます。すべてが4バイトに揃えられています。パディングプラグマディレクティブを指定すると、パディングを取り除くことができます。 たとえば、

#pragma pack(0) 

gcc。

+0

奇妙なことに、私がpack(1)を実行すると、上の2つの要素の構造体の場合でも16が返されますが、uint32_tを1つ追加すると20個になります...困惑 –

関連する問題