바이트패딩


struct a {
	char b;
	int  c;
}

위 경우에 sizeof 연산자를 사용하게 되면 char 1byte + int 4byte = 5byte가 필요하다고 생각할 수 있다.

하지만 생각과 달리 8byte가 필요하다. 결론부터 먼저 말하면

현재 기기의 주소체계에 맞는 연산비트에 맞추게 된다

예를들어, 32비트 CPU는 한번에 메모리에서 32비트씩 가져와서 연산을 하기 때문에 4byte단위로 접근을 한다.

만약 5byte만 할당이 되어 있다면 우리가 int변수 안의 메모리를 온전히 가져오기 위해서는 4byte를 먼저 불러오고 다시 4byte를 또 불러와야 하기 때문에 불필요한 오버헤드가 발생하게 된다.

메모리 공간 낭비가 있을지언정 연산범위에 맞게 메모리를 할당을 하게 되면 이러한 오버헤드를 줄여 연산 성능에 도움을 줄 수 있다

보통 바이트패딩에 대한 설명으로 클래스와 구조체를 통해서 설명을 하곤 하지만, 지역변수 또한 바이트 패딩이 된다는 사실을 실험해보았다.

#include <stdio.h>

int	main(void)
{
	char a = 'a';
	char b = 'b';
	int c = 1;

	printf("%p %p %p", &a, &b, &c);
	return (0);
}

//결과
0x7ffee4fc38fb 0x7ffee4fc38fa 0x7ffee4fc38f4

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a4a8a57d-6354-4df0-865a-ce76920697c5/Untitled.png

int c 의 주소가 0x7ffee4fc38f4부터 시작이기 때문에 int는 4byte이므로 ...7의 메모리 영역까지 차지

char a char b 는 1byte 자료형이므로 각각의 주소에 한칸씩 자리 차지

메모리가 연속적으로 할당된 것이 아니라 중간에 바이트 패딩이 생긴 것을 확인 할 수 있음

조금 더 자세한 설명은 아래 링크 참고 ⬇️

바이트 패딩(Byte Padding)