정렬과 패딩(Alignment and Padding)란?

데이터를 형마다 정해진 수의 배수 주소에 두는 것(정렬, alignment)과, 그 때문에 데이터 사이나 뒤에 넣는 사용하지 않는 바이트(패딩, 채움 바이트). int가 4바이트 경계에 맞춰지는 환경에서는 struct { char c; int i; char d; }의 c 뒤에 3바이트, d 뒤에 3바이트가 들어가며 크기는 12바이트가 된다. 경계에 맞지 않는 주소의 읽기/쓰기는 CPU에 따라 느려지거나 예외가 되기도 한다. 멤버를 큰 형부터 순서대로 나열하면 패딩을 줄일 수 있다.

일본어 명칭: アライメントとパディング

정렬과 패딩(Alignment and Padding)은(는) ISA와 어셈블리, C 언어 기초 등 2개 분야의 연습 문제 2개에 나와요.

분야: C 언어 기초

도전해 보기: 정렬과 패딩(Alignment and Padding) 관련 문제

RISC-V에서 4바이트를 읽는 lw 명령어의 주소가 4의 배수가 아닐 때(경계가 맞지 않을 때) 일어날 수 있는 일로 올바른 것은?

  1. A명령어가 자동으로 다음 4의 배수 주소로 바꿔 읽혀 항상 같은 속도로 올바르게 읽을 수 있다
  2. BCPU 구현에 따라 예외가 발생하거나, 하드웨어나 소프트웨어로 처리되어 매우 느려질 수 있다
  3. C주소의 하위 2비트는 무시되고 오류는 발생하지 않는다
정답과 해설 보기

정답: B. CPU 구현에 따라 예외가 발생하거나, 하드웨어나 소프트웨어로 처리되어 매우 느려질 수 있다

4바이트 데이터를 4의 배수 주소에 두면 한 번의 메모리 접근으로 읽을 수 있습니다. 경계를 넘으면 두 번의 접근이 필요하므로, RISC-V는 경계가 어긋난 접근을 회로로 처리할지, 예외를 일으켜 소프트웨어에 맡길지를 구현에 위임하고 있습니다. 후자라면 자릿수가 다를 만큼 느려집니다. 컴파일러가 구조체 멤버 사이에 패딩을 넣어 정렬하는 것은 이 때문입니다.

해설 속 정렬과 패딩(Alignment and Padding)

정렬과 패딩(Alignment and Padding)이(가) 나오는 문제 (2)

  1. RISC-V에서 4바이트를 읽는 lw 명령어의 주소가 4의 배수가 아닐 때(경계가 맞지 않을 때) 일어날 수 있는 일로 올바른 것은?
  2. char는 1바이트, int는 4바이트이며, int를 4의 배수 주소에 맞춰 두는 일반적인 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?

관련 용어

구조체(struct) 배열(Array) 공용체(union) 댕글링 포인터(Dangling Pointer) 동적 메모리 할당(Dynamic Memory Allocation) 매크로(Macro) 메모리 누수(Memory Leak) 미정의 동작(Undefined Behavior) 버퍼 오버플로(Buffer Overflow) 비트 필드(Bit-field)

용어집으로 돌아가기