공백 클래스(empty class)와 바이트 패딩(byte padding)
Study/C/C++ 2008. 8. 28. 20:43 |Effective C++ 책 39항목에 보면 공백 클래스(empty class)라는 것이 나온다. 개념 자체는 매우 쉽다. 아무런 멤버 변수도 없고, 가상 함수도 없고, 가상 기본 클래스도 없는... 말 그대로 비어있는 클래스이다. 예를 들어, 다음과 같은 형태로 정의된 클래스이다.
class Empty {};
그런데, 이 클래스의 실제 크기는 얼마나 될까??? C++ 에서는 크기가 0인 독립 구조의 객체가 생기는 것을 금지하기 떄문에, 이 클래스의 크기(sizeof)는 0이 아니다. 컴파일러는 이러한 '공백' 객체에 char 한 개를 슬그머니 끼워넣는 식으로 처리하여, 크기는 1이 된다.
즉, sizeof(Empty) 의 값은 1이 된다.
이를 숙지하고 다음 코드를 살펴보자. 그리 어렵지 않는 문제이다.
#include <stdio.h>
class A {};
class B {
int x;
A e;
};
int main(void)
{
printf("sizeof(A) = %dn", sizeof(A));
printf("sizeof(B) = %dn", sizeof(B));
return 0;
}
자, 이 코드를 실행하면 과연 어떤 결과가 출력이 될까?? 뜸들이지 않고 답을 말하면 다음과 같다.
sizeof(A) = 1
sizeof(B) = 8
위 결과에서, 클래스 B의 크기가 8이 되는 것은 바이트 패딩(byte padding) 때문이며, 이는 클래스 내부 데이터의 바이트를 4바이트 단위로 할당하기 때문이다. 이는 CPU에서 연산의 속도를 향상시키기 위한 장치라고 보면 된다. 참고로, 이는 컴파일러 옵션 또는 #pragma 전처리기를 사용하여 변경할 수 있다. 그러나, 기본적으로는 4바이트(int 형의 크기) 단위를 사용하는 것이 일반적이다.
참고로, C 언어에서는 위와 같은 것이 어떻게 동작을 할까?? C 언어에는 class 가 없으므로, 이는 구조체로 변경하여 생각할 수 있을 것이다. C 언어에서는 비어있는 구조체를 만들 수 없으므로 char 타입 하나를 갖는 구조체를 만들어서 테스트를 해보자.
#include <stdio.h>
typedef struct _A {
char c;
} A;
typedef struct _B {
int x;
A e;
} B;
int main(void)
{
printf("sizeof(A) = %dn", sizeof(A));
printf("sizeof(B) = %dn", sizeof(B));
return 0;
}
이 코드의 실행 결과는 앞의 것과 동일하며, 이는 마찬가지로 바이트 패딩 때문이다.
sizeof(A) = 1
sizeof(B) = 8
class Empty {};
그런데, 이 클래스의 실제 크기는 얼마나 될까??? C++ 에서는 크기가 0인 독립 구조의 객체가 생기는 것을 금지하기 떄문에, 이 클래스의 크기(sizeof)는 0이 아니다. 컴파일러는 이러한 '공백' 객체에 char 한 개를 슬그머니 끼워넣는 식으로 처리하여, 크기는 1이 된다.
즉, sizeof(Empty) 의 값은 1이 된다.
이를 숙지하고 다음 코드를 살펴보자. 그리 어렵지 않는 문제이다.
#include <stdio.h>
class A {};
class B {
int x;
A e;
};
int main(void)
{
printf("sizeof(A) = %dn", sizeof(A));
printf("sizeof(B) = %dn", sizeof(B));
return 0;
}
자, 이 코드를 실행하면 과연 어떤 결과가 출력이 될까?? 뜸들이지 않고 답을 말하면 다음과 같다.
sizeof(A) = 1
sizeof(B) = 8
위 결과에서, 클래스 B의 크기가 8이 되는 것은 바이트 패딩(byte padding) 때문이며, 이는 클래스 내부 데이터의 바이트를 4바이트 단위로 할당하기 때문이다. 이는 CPU에서 연산의 속도를 향상시키기 위한 장치라고 보면 된다. 참고로, 이는 컴파일러 옵션 또는 #pragma 전처리기를 사용하여 변경할 수 있다. 그러나, 기본적으로는 4바이트(int 형의 크기) 단위를 사용하는 것이 일반적이다.
참고로, C 언어에서는 위와 같은 것이 어떻게 동작을 할까?? C 언어에는 class 가 없으므로, 이는 구조체로 변경하여 생각할 수 있을 것이다. C 언어에서는 비어있는 구조체를 만들 수 없으므로 char 타입 하나를 갖는 구조체를 만들어서 테스트를 해보자.
#include <stdio.h>
typedef struct _A {
char c;
} A;
typedef struct _B {
int x;
A e;
} B;
int main(void)
{
printf("sizeof(A) = %dn", sizeof(A));
printf("sizeof(B) = %dn", sizeof(B));
return 0;
}
이 코드의 실행 결과는 앞의 것과 동일하며, 이는 마찬가지로 바이트 패딩 때문이다.
sizeof(A) = 1
sizeof(B) = 8
'Study > C/C++' 카테고리의 다른 글
double atan2(double y, double x) 사용법 (0) | 2008.11.30 |
---|---|
유니코드의 역사, 인코딩, 프로그래밍 (0) | 2008.10.01 |
상수 객체 참조자에 의한 전달(Pass-by-reference-to-const) (0) | 2008.06.27 |
vector 에서 동적 할당한 데이터 처리하기 (0) | 2008.02.20 |
STL의 priority_queue 사용 예제 (0) | 2006.03.06 |