2012-04-12 14 views
3

64ビットLinuxマシン上に以下の構造体があります。64ビットマシン上での構造体の整列

struct __wait_queue_head { 
      spinlock_t lock; 
      struct list_head task_list; 
    }; 

where 

typedef struct { 
      raw_spinlock_t raw_lock; 
    } spinlock_t; 

and 

struct list_head { 
      struct list_head *next, *prev; 
    }; 

raw_spinlock_t is defined as: 

typedef struct { 
      volatile unsigned int slock; 
    } raw_spinlock_t; 

は、今私はLP64標準以下の64ビットLinuxマシン上の構造体__wait_queue_headのアライメントを理解したいです。私が知っていることから、この構造体の最初のフィールドすなわち、

spinlock_t lock 

は、64ビットマシンで4バイトを占めるunsigned intです。この構造体は、4バイトのアライメントされたアドレスから開始する必要があります。しかし、私はそれが実際のシステムの場合ではないことを見てきました。代わりに、構造体は8バイトのアライメントされたアドレスから開始しますが、最初のフィールドのアラインメント要件は4バイトのアライメントされたアドレスで満たされます。基本的に、構造体のアライメントを制御するのは何ですか?私は構造体内のフィールドのパディング概念についてはっきりしていることに注意してください。構造体そのものの位置合わせの必要条件は、私が混乱していることです。

+0

私が正しいとすれば、パフォーマンス向上のために各フィールドを8バイトの位置に配置するのでしょうか?レジスタは64bなので、一度にロードすることができます。 – fduff

+0

すべてのフィールドが8バイト境界に整列しているわけではありません。 unsigned shortのようなデータ型は2バイト整列され、unsigned intは4バイト整列されます。構造体の 'outside'変数の場合、変数は 'sizeof(variable)'バイト整列アドレスで整列することが期待されます。 – gjain

答えて

6

構造体の位置合わせの要件は、そのメンバーの中で最も大きな位置合わせ要件です。この場合、struct list_headにはポインタが含まれているため、struct list_headのアラインメントは8バイトです。 struct __wait_queue_headにはstruct list_headが含まれているため、その配置も8バイトです。これは、構造体がより緩い位置合わせ要件を有する場合、構造体のパディングが、メンバーが適切に位置合わせされることを保証するのに十分でないために必要とされる。

+0

構造体のすべてのデータメンバーを正しく整列させるには、構造体のパディングがうまくいかない例を挙げてください。 IMOでは、データメンバーを正しく整列させるには常にパディングが必要です。 – gjain

+1

@ Gaurav 4バイトのメンバーのあとに8バイトのメンバーが続く構造体を想像してください。パディング規則は、メンバー間に4バイトのパディングを追加します。構造体が8バイトで整列されている場合、両方のメンバは8バイトで整列され、これで十分です。構造体が4バイトの奇数倍に整列されている場合、最初のメンバは4バイト整列されますが、2番目のメンバはパディングのために整列しません。構造体のすべてのインスタンスに同じメモリレイアウトを与えながら、配置を正しく行う唯一の方法は、最大の型に従って整列させることです。 – hobbs

+0

これはまだ得られていないため、すみません。構造体が4バイトの奇数倍、つまり12バイトにアライメントされていても、最初はなぜパディングが必要なのでしょうか?最初のフィールドは4バイトを占め、次のフィールドは16バイト目から開始することができ、これは完全な8バイトの整列アドレスです。データメンバのアライメントはまだ正しいです。私が間違っている場合、私を修正してください。 – gjain

関連する問題