도구스개발

구조체 정렬·패딩 계산기

C 구조체 필드를 넣으면 오프셋과 패딩, 전체 크기를 계산합니다. 순서를 바꿨을 때 얼마나 줄어드는지도 함께 보여줍니다.

한 줄에 하나씩. 「int x」 「char name[16]」 「unsigned long count」 모두 됩니다.

바이트

0이면 제한 없음입니다. 1로 두면 패딩이 아예 사라집니다.

구조체 크기

12 바이트

정렬 4바이트 · 실제로 쓰는 건 6바이트 · 6바이트(50%)가 패딩

배치

오프셋타입이름크기정렬앞 패딩
0chara11
4int / int32_t / floatb443
8charc11

마지막에 3바이트가 더 붙습니다 — 배열로 만들었을 때 다음 원소의 첫 필드도 정렬 경계에 놓여야 하기 때문입니다.

전체 크기12 바이트
구조체 정렬값4 바이트
실제로 쓰는 바이트6 바이트
패딩6 바이트
버려지는 비율50%

정렬이 큰 것부터 놓으면

바꾼 순서b → a → c
크기8 바이트
패딩2 바이트
줄어드는 양4 바이트
순서만 바꿔도 4바이트가 줄어듭니다. 같은 필드인데 12바이트가 8바이트가 됩니다. 크기가 큰 것부터 놓으면 앞쪽에서 생기는 구멍이 사라지기 때문입니다. 이 구조체를 백만 개 만든다면 3.8MB 차이입니다.
규칙은 셋뿐입니다. 필드는 자기 정렬값의 배수인 오프셋에 놓이고, 구조체의 정렬값은 필드 정렬값 중 가장 큰 것이며, 전체 크기는 그 정렬값의 배수로 올림됩니다. 나머지는 이 셋에서 따라 나옵니다.

타입별 크기와 정렬

타입크기정렬
char11
bool / _Bool11
int8_t / uint8_t11
short / int16_t22
int / int32_t / float44
long / int64_t / double88
pointer (void*)88
long double1616
여기 값은 x86-64 System V ABI(리눅스, 인텔 맥) 기준입니다. 다른 곳은 다릅니다 — arm64 맥(애플 실리콘)에서는 long double이 8바이트이고, 윈도우(LLP64)에서는 long이 4바이트이며, 32비트에서는 포인터가 4바이트입니다. char 1 · short 2 · int 4 · double 8은 거의 모든 곳에서 같습니다. 중첩 구조체와 비트필드는 다루지 않습니다.

사용 방법

  1. 1구조체 필드를 한 줄에 하나씩 적습니다. 「int x」처럼요.
  2. 2오프셋과 패딩이 표로 나옵니다.
  3. 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일 · 결과는 참고용 추정치입니다.