구조체 정렬·패딩 계산기
C 구조체 필드를 넣으면 오프셋과 패딩, 전체 크기를 계산합니다. 순서를 바꿨을 때 얼마나 줄어드는지도 함께 보여줍니다.
한 줄에 하나씩. 「int x」 「char name[16]」 「unsigned long count」 모두 됩니다.
0이면 제한 없음입니다. 1로 두면 패딩이 아예 사라집니다.
구조체 크기
12 바이트
정렬 4바이트 · 실제로 쓰는 건 6바이트 · 6바이트(50%)가 패딩
배치
| 오프셋 | 타입 | 이름 | 크기 | 정렬 | 앞 패딩 |
|---|---|---|---|---|---|
| 0 | char | a | 1 | 1 | — |
| 4 | int / int32_t / float | b | 4 | 4 | 3 |
| 8 | char | c | 1 | 1 | — |
마지막에 3바이트가 더 붙습니다 — 배열로 만들었을 때 다음 원소의 첫 필드도 정렬 경계에 놓여야 하기 때문입니다.
정렬이 큰 것부터 놓으면
타입별 크기와 정렬
| 타입 | 크기 | 정렬 |
|---|---|---|
| char | 1 | 1 |
| bool / _Bool | 1 | 1 |
| int8_t / uint8_t | 1 | 1 |
| short / int16_t | 2 | 2 |
| int / int32_t / float | 4 | 4 |
| long / int64_t / double | 8 | 8 |
| pointer (void*) | 8 | 8 |
| long double | 16 | 16 |
long double이 8바이트이고, 윈도우(LLP64)에서는 long이 4바이트이며, 32비트에서는 포인터가 4바이트입니다. char 1 · short 2 · int 4 · double 8은 거의 모든 곳에서 같습니다. 중첩 구조체와 비트필드는 다루지 않습니다.사용 방법
- 1구조체 필드를 한 줄에 하나씩 적습니다. 「int x」처럼요.
- 2오프셋과 패딩이 표로 나옵니다.
- 3아래에서 순서를 바꿨을 때 얼마나 줄어드는지 확인하세요.
자주 묻는 질문
각 필드는 자기 정렬값의 배수인 위치에 놓여야 해서 중간에 빈 자리가 생기기 때문입니다. 또 구조체 전체 크기도 가장 큰 정렬값의 배수로 올림됩니다.
char가 0번지, int는 4의 배수여야 하므로 4번지(1~3은 패딩), 두 번째 char가 8번지에 놓여 9바이트를 쓰고, 구조체 정렬이 4라 12바이트로 올림됩니다. 순서를 int, char, char로 바꾸면 8바이트입니다.
배열로 만들었을 때 다음 원소의 첫 필드도 정렬 경계에 놓여야 하기 때문입니다. 그래서 전체 크기를 구조체 정렬값의 배수로 맞춥니다.
정렬값이 큰 필드부터 놓으면 됩니다. 앞쪽에서 생기던 구멍이 사라져 패딩이 줄어듭니다. 구조체를 수백만 개 만드는 코드라면 이 차이가 그대로 메모리가 됩니다.
크기는 줄지만 정렬되지 않은 접근이 생겨 느려지거나 아키텍처에 따라 죽습니다. 파일 형식이나 네트워크 프로토콜처럼 바이트 배치가 이미 정해진 곳에만 씁니다.
x86-64 System V ABI(리눅스, 인텔 맥) 기준입니다. arm64 맥에서는 long double이 8바이트이고, 윈도우에서는 long이 4바이트이며, 32비트에서는 포인터가 4바이트입니다. char 1 · short 2 · int 4 · double 8은 거의 모든 곳에서 같습니다.
알아두면 좋은 점
- x86-64 System V ABI 기준입니다. 다른 ABI에서는 long·long double·포인터 크기가 다릅니다.
- 중첩 구조체와 비트필드는 다루지 않습니다.
- 배열은 원소 타입의 정렬을 따르고 크기만 개수만큼 곱해집니다.
함께 보면 좋은 도구
마지막 검증: 2026년 8월 30일 · 결과는 참고용 추정치입니다.