최근 P*BG 프로그래머 면접을 갔다가 바이트 패딩 관련 질문을 받은적이 있습니다.

 

분명 대학교때 배웠던 내용인데, 오래된지라 제대로 답변을 못한거같아 집에 와서 다시 공부해보니

 

어렵지 않은 개념이었는데 설명을 제대로 하지 못한거같아 아쉬움이 남습니다. 고로 내용을 정리해둡니다


What & Why

클래스 혹은 구조체에는 다양한 변수들이 들어 있을 수 있습니다. 데이터 중에 

패디드 바이트(혹은 패딩바이트) 라는 추가 메모리공간을 사용하여

CPU가 연산을 위해 데이터를 읽는 횟수를 줄여주는 방법을 말합니다.

 

요약하자면

바이트패딩은 CPU 연산 부하량을 줄여줄 목적으로, 클래스 혹은 구조체에 패디드 바이트를 추가하는것입니다.

 

How

메모리를 더 사용해서 CPU의 연산을 줄여준다는 개념은 알겠으나, 어떻게 이루어지는지 간단히 알아보겠습니다.

예시를 보기 앞서, 32비트 환경서는 CPU가 연산을 위해 4바이트씩 데이터를 가져온다는 사실을 알아야 합니다.

 

우리에게 아래와 같은 클래스가 있다고 가정하겠습니다

여기서부턴 패딩바이트가 적용되지 않은 첫째 예시입니다. 

 

이런 속성을 가진 데이터에 CPU가 접근해서 firstData를 수정하는

 

연산을 해야한다면 해당 데이터가 있는 위치의 주소를 따라가서 4바이트를 읽어 수정하면 되니 문제가 되지 않습니다.

첫째 정수형을 수정하는데는 CPU가 값을 쓰기 위해 한번만 다녀오면 됩니다. 다음으로 가겠습니다

어느 지시가 들어와서 두번째 데이터인 secondData를 수정해야한다고 하면 CPU가 한번에 4바이트를 가져오니

 

여전히 문제가 되진 않습니다. sD의 시작점부터 4바이트를 일단 가져온 후 첫째 1바이트만 읽으면 되니깐요.

세번째에선 문제가 생깁니다. thirdData가 4바이트 두 영역에 걸쳐있기때문에

 

첫째로 가져온 4바이트 블록에선 thirdData의 일부만 가져오고, 완전한 데이터를 가져오기 위해

 

한번 더 4바이트를 읽어와서 thirdData를 온전히 읽게 됩니다. 4바이트 정수형을 수정하는데 4바이트를 읽는 

 

CPU로 두번을 읽어오면 연산상으로 손해가 나게 됩니다.


여기서 Padding Byte를 추가한 개념으로 thirdData를 다시 보도록 하겠습니다

1바이트였던 char형 secondData 뒤에 3바이트의 패딩바이트가 붙었습니다.

 

메모리 공간을 추가로 사용하긴 하나, 이제 하나의 데이터에 접근할땐 CPU가 한번의 읽기만 하면 됩니다.

 

 

해당 개념을 응용한 64비트 환경서의 패딩바이트 문제가 펄어** 같은 대기업 면접서 물어보기도 하나

 

64비트 환경서는 CPU가 한번에 8바이트를 읽어온다는 점을 인지하고 디폴트 패킹값을 고려해 답변하면 됩니다.

 

 

간단하게 작성된 아래 C++코드를 활용하여 직접 패딩을 확인 가능합니다

#include <iostream>

class A
{
	int a;  //4바이트
	char b; //1바이트
	char c; //1바이트
};

class B
{
	char a; //1바이트
	int b;  //4바이트
	char c; //1바이트
}
;

int main()
{
	std::cout << sizeof(A) << std::endl;
	std::cout << sizeof(B) << std::endl;
}

해당 실행 결과값은 아래와 같습니다

+ Recent posts