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 비트 리눅스 시스템에서 구조체 __wait_queue_head의 정렬을 이해하고 싶다. 내가 아는 바로는이 구조체의 첫 번째 필드 즉,
spinlock_t lock
64 비트 시스템에서 4 바이트를 차지 부호 INT는이 구조체는 4 바이트 정렬 된 어드레스에서 시작해야한다. 그러나, 나는 그것이 실제 시스템에서는 그렇지 않다는 것을 알았다. 대신 struct는 8 바이트 정렬 주소에서 시작하지만 첫 번째 필드의 정렬 요구 사항은 4 바이트 정렬 주소로 충족됩니다. 기본적으로 구조체의 정렬을 제어하는 것은 무엇입니까? 구조체 내의 필드에 대한 패딩 개념에 대해서는 분명합니다. 구조체 자체의 정렬 요구 사항은 혼란 스럽습니다.
내가 맞으면 컴파일러가 각 필드를 성능 향상을 위해 8 바이트 정렬에 배치하겠습니까? 레지스터는 64b이므로 한 번에로드 될 수 있습니다. – fduff
모든 필드가 8 바이트로 정렬되는 것은 아닙니다. 부호없는 short와 같은 데이터 유형은 2 바이트 정렬되고 부호없는 int는 4 바이트 정렬입니다. struct 외부의 변수의 경우 변수는 'sizeof (variable)'바이트 정렬 주소에서 정렬되어야합니다. – gjain