C++에서 멤버 변수나 멤버 함수가 전혀 없는 빈 클래스(empty class)의 크기는 얼마일까요? 많은 개발자가 직관적으로 0바이트라고 생각하지만, 실제로는 1바이트입니다. 그 이유와 함께 직접 확인할 수 있는 예제 코드를 살펴보겠습니다.
왜 빈 클래스의 크기가 1바이트인가?
C++ 표준에서는 서로 다른 객체가 반드시 서로 다른 메모리 주소를 가져야 한다고 규정합니다. 만약 빈 클래스의 크기가 0이라면, 같은 클래스로 생성된 여러 객체들이 동일한 주소를 가질 수 있게 되어 이 규칙에 어긋나게 됩니다. 따라서 컴파일러는 데이터가 없더라도 각 객체를 구별할 수 있도록 최소 1바이트를 할당합니다.
예제 코드
아래 예제를 통해 빈 클래스와 비어 있지 않은 클래스의 크기를 직접 비교해 볼 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
class p1 {
public:
void first() {
cout << "\nThe parent class p1 function is called.";
}
};
class p2 { };
int main() {
cout << "The size of non-empty class p1 = " << sizeof(p1);
cout << "\nThe size of empty class p2 = " << sizeof(p2);
p2 p;
cout << "\nThe size of object of empty class p2 = " << sizeof(p);
p1 o;
cout << "\nThe size of object of non-empty class p1 = " << sizeof(o);
return 0;
}실행 결과
The size of non-empty class p1 = 1 The size of empty class p2 = 1 The size of object of empty class p2 = 1 The size of object of non-empty class p1 = 1
코드 분석
위 프로그램에서는 먼저 아무런 멤버도 가지지 않는 빈 클래스 p2를 정의했습니다.
class p2
{ };그리고 sizeof 연산자를 사용해 클래스 자체의 크기와 해당 클래스로 생성된 객체의 크기를 각각 출력합니다.
cout << "The size of non-empty class p1 : " << sizeof(p1); cout << "\nThe size of empty class p2 : " << sizeof(p2); p2 p; cout << "\nThe size of object of empty class : " << sizeof(p); p1 o; cout << "\nThe size of object of non-empty class p1 : " << sizeof(o);
결과 해석
실행 결과를 보면 흥미로운 점을 발견할 수 있습니다. 멤버 함수만 포함된 클래스 p1과 완전히 빈 클래스 p2, 그리고 두 클래스로 생성한 객체 모두 크기가 1바이트로 동일하게 출력됩니다.
- 멤버 함수는 객체 크기에 포함되지 않습니다. 멤버 함수는 코드 영역에 존재하며, 모든 객체가 이를 공유하기 때문입니다.
- 빈 클래스라도 최소 1바이트를 차지합니다. 앞서 설명했듯이 각 객체가 고유한 메모리 주소를 갖도록 보장하기 위함입니다.
참고: EBO(Empty Base Optimization)
다만 한 가지 예외적인 상황이 있습니다. 빈 클래스를 기본 클래스(base class)로 상속하는 경우에는 컴파일러가 EBO(Empty Base Optimization) 기법을 적용하여 추가 메모리를 할당하지 않을 수 있습니다. 즉, 빈 클래스를 독립적인 객체로 사용할 때만 1바이트가 필요하며, 상속 구조에서는 최적화를 통해 공간 낭비를 줄일 수 있습니다.
정리
C++에서 빈 클래스의 크기는 1바이트입니다. 이는 객체마다 고유한 메모리 주소를 보장하기 위한 언어 표준의 요구 사항이며, 멤버 함수는 객체의 크기에 영향을 주지 않는다는 점도 함께 기억해 두면 좋습니다.