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バイトのアライメントされたアドレスで満たされます。基本的に、構造体のアライメントを制御するのは何ですか?私は構造体内のフィールドのパディング概念についてはっきりしていることに注意してください。構造体そのものの位置合わせの必要条件は、私が混乱していることです。
私が正しいとすれば、パフォーマンス向上のために各フィールドを8バイトの位置に配置するのでしょうか?レジスタは64bなので、一度にロードすることができます。 – fduff
すべてのフィールドが8バイト境界に整列しているわけではありません。 unsigned shortのようなデータ型は2バイト整列され、unsigned intは4バイト整列されます。構造体の 'outside'変数の場合、変数は 'sizeof(variable)'バイト整列アドレスで整列することが期待されます。 – gjain