C++에서 sizeof()가 연산자로 구현되는 이유
많은 개발자들이 sizeof를 함수처럼 착각하지만, 사실 C++에서 sizeof는 단항 연산자(unary operator)입니다. 겉보기에는 sizeof(int)처럼 함수 호출과 똑같이 생겼지만, 실제로는 인수의 크기에 해당하는 상숫값을 코드에 삽입하는 특수한 문법일 뿐입니다.
sizeof의 가장 큰 특징은 컴파일 타임에 값이 결정된다는 점입니다. 프로그램 실행 중에 별도의 연산을 수행할 필요가 없으므로 런타임 지원이 전혀 필요하지 않습니다.
sizeof를 오버로딩할 수 없는 이유
sizeof는 사용자가 오버로딩할 수 없습니다. 그 이유는 배열을 가리키는 포인터를 증가시키는 것과 같은 기본 제공 연산들이 내부적으로 sizeof에 의존하기 때문입니다. 만약 sizeof를 오버로딩할 수 있다면 포인터 산술 연산의 동작까지 달라져 언어 전체의 일관성이 무너지게 됩니다.
C 표준 역시 sizeof가 반드시 연산자로 구현되어야 한다고 명시하고 있습니다. 대부분의 컴파일러는 sizeof의 값을 컴파일 시점 자체에서 동일한 상수로 치환해 버립니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
cout << "Size of char : " << sizeof(char) << endl;
cout << "Size of int : " << sizeof(int) << endl;
cout << "Size of short int : " << sizeof(short int) << endl;
cout << "Size of long int : " << sizeof(long int) << endl;
cout << "Size of float : " << sizeof(float) << endl;
cout << "Size of double : " << sizeof(double) << endl;
cout << "Size of wchar_t : " << sizeof(wchar_t) << endl;
return 0;
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Size of char : 1
Size of int : 4
Size of short int : 2
Size of long int : 4
Size of float : 4
Size of double : 8
Size of wchar_t : 4
char는 표준상 항상 1바이트로 고정되어 있지만, int나 long 같은 정수형의 크기는 플랫폼과 컴파일러에 따라 달라질 수 있습니다. 따라서 이식성 있는 코드를 작성할 때는 각 자료형의 크기를 하드코딩하지 말고 sizeof를 활용하는 것이 좋습니다.