do it 아저씨 유튜브 영상에서 말하길
“구조체의 멤버 중 가장 큰 자료형의 크기를 기준으로 align 한다”
doit 아저씨가
이 말을 하기 바로전에 4byte alignment, 2byte alignment 등의 예를 들어서
alignment에 대해 설명을 해준다
2byte alignment라면 할당되는 블록의 시작 주소가 2의 배수가 되어야 한다는 얘기인데
이는 명확하다 정확히 우리가 아는 내용이다
하지만 위의 가장 큰 사이즈의 멤버를 기준으로 align한다는 말은 좀 쌩뚱맞다
영상 속 설명을 보면 뭔가 명확하지 못하다
심지어 본인의 책 do it의 텍스트 어디에도 이런 내용은 없었다 … 🤷🏻♂️
아래는 영상 속 예시이다

구조체 B의 경우에도 가장 8byte align을 해야 한다면 a,d,c가 8의 배수가 되는 주소로 align이 되어야하는데 이러면 뭔가 이상하다
설명이 맞다면 그림과 전혀 다른 식으로 할당했어야한다
음 … CSAPP의 설명을 보자
CSAPP said 🙏🏻
“Their alignment rule is based on the principle that any primitive object of K bytes must have an address that is a multiple of K”
→ 구조체의 각 멤버들은 본인의 사이즈를 기준으로 align 한다는 간결한 설명이다
→ 실제 test 코드를 작성하여 확인해본 결과, 이 내용을 믿으면 된다
CSAPP를 믿어라 의심하지마라

test code 와 결과
#include <stdio.h>
#include <stdlib.h>
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
struct P1 {
char c1;
short s1;
char c2;
short s2;
int i;
};
int main(void) {
printf("P1 c1:%zu\\n", offsetof(struct P1, c1));
printf("P1 s1:%zu\\n", offsetof(struct P1, s1));
printf("P1 c2:%zu\\n", offsetof(struct P1, c2));
printf("P1 s2:%zu\\n", offsetof(struct P1, s2));
printf("P1 i:%zu\\n", offsetof(struct P1, i));
printf("P1 size:%zu\\n\\n", sizeof(struct P1));
}
출력 결과

참고

추가로
char a[10]; 처럼 배열의 형태로 멤버가 선언된 경우
배열 전체의 크기(10bytes)가 아닌 배열 원소 자료형의 크기(1byte)를 기준으로 배열 시작 주소를 align 한다