[질문]
Alignment requirement C 질문
익명(222.164)
2021-06-26 11:44
추천 0
csapp 문제 푸는 중인데
struct {
char *a
;
short b
;
double c
;
char d
;
float e
;
char f
;
long g
;
int h
;
} rec
;
각 필드들 offset 이랑 구조체 크기 구하는 거거든
난 이럴 줄 알았단 말이지
struct {
char *a
; // 0
short b
; // 8
// 6 bytes padding
double c
; // 16
char d
; // 24
float e
; // 25
char f
; // 29
// 2 bytes padding
long g
; // 32
int h
; // 40
} rec
;
// Total 48 bytes
근데 답은 이러더라고
struct {
char *a
; // 0
short b
; // 8
// 6 bytes padding
double c
; // 16
char d
; // 24
// 3 bytes padding
float e
; // 28
char f
; // 32
// 7 bytes padding
long g
; // 40
int h
; // 48
} rec
;
// Total 56 bytes
d 랑 e 사이에 왜 4 바이트 alignment requirement 인지 모르겠다
전체 구조체의 alignment requirement 는 8 인 건 알거든
alignment requirement 가 보통 다른 필드들의 alignment 의 최소공배수로 구해진다고 아는데 아닌가?
그게 아니면 설마 앞에 필드를 기준으로 alignment 를 해야 하는 건가. 그러면 이해가 되는데
따로 지정하지 않는 이상 각 멤버의 offset이 alignment 값의 배수여야 하는데 저 경우 float가 4byte(8byte일 때도 존재하는데 이 문제에서는 4로 보는 듯) 단위로 정렬되어야 하니 패딩이 들어가게 됨
다시 보니까 float는 4byte가 맞네
32bit Linux에서는 double이 4byte 정렬이고 64bit Linux, Windows에서는 8byte인 거랑 헷갈렸네
d, e 는 이해했어. 구조체 alignment 랑 필드별 alignment 를 다르게 계산해야 하는 거지?
내가 알기론 이거 표준에도 명시되어있지 않은 걸로 아는데
사실 pragma나 attribute 등으로 조정할 수는 있다만 일반적으로는 모든 access가 aligned이도록 배치하게 됨