Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ sizeof 연산자 완벽 가이드: 기본 사용법부터 실전 활용까지


C++의 sizeof 연산자는 데이터 타입이나 데이터 구조가 차지하는 메모리 크기를 바이트 단위로 계산하는 데 사용되는 연산자입니다. 이 연산자는 부호 없는 정수(unsigned integer) 타입의 값을 반환하며, 기본(primitive) 데이터 타입과 복합(compound) 데이터 타입 모두에 적용할 수 있습니다. sizeof를 데이터 타입에 직접 적용하면 해당 타입이 차지하는 메모리 크기를 바로 확인할 수 있습니다.

기본 데이터 타입의 크기 확인하기

예제 코드

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << sizeof(int) << "\n";    // 4바이트
    cout << sizeof(char) << "\n";   // 1바이트
    cout << sizeof(float) << "\n";  // 4바이트
    cout << sizeof(long) << "\n";   // 8바이트 (64비트 시스템)
    return 0;
}

실행 결과

4
1
4
8

이 기능을 활용하면 특정 데이터 타입의 변수가 차지하는 메모리 공간을 정확히 파악할 수 있습니다. 다만 주의할 점은 결과값이 컴파일러와 시스템 아키텍처에 따라 달라질 수 있다는 것입니다. 예를 들어 16비트 컴파일러에서 int는 2바이트이지만, 32비트 또는 64비트 컴파일러에서는 일반적으로 4바이트입니다.

표현식(Expression)에 sizeof 적용하기

sizeof 연산자는 변수나 표현식에도 적용할 수 있습니다. 흥미로운 점은 sizeof가 컴파일 타임(compile-time)에 처리되기 때문에, 피연산자로 전달된 표현식은 실제로 평가되지 않는다는 것입니다.

예제 코드

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x = 5;
    cout << sizeof(x++) << "\n"; // 표현식의 타입 크기만 계산
    cout << x << "\n";           // 증감 연산이 실제로 실행되지 않음
    return 0;
}

실행 결과

4
5

위 예제에서 sizeof(x++)는 int 타입의 크기인 4를 반환하지만, x++라는 증감 연산은 실제로 수행되지 않아 x의 값은 여전히 5로 유지됩니다. 이는 sizeof가 런타임이 아닌 컴파일 타임에 평가되기 때문이며, 피연산자 표현식의 값에는 어떠한 부수 효과(side effect)도 발생시키지 않습니다.

sizeof 연산자가 필요한 이유

sizeof 연산자는 다양한 용도로 활용되지만, 가장 대표적인 용도는 배열, 구조체(structure), 공용체(union) 같은 복합 데이터 타입의 크기를 결정하는 것입니다.

활용 사례 1: 배열 크기 계산하기

배열 전체의 크기를 요소 하나의 크기로 나누면 배열에 포함된 요소의 개수를 구할 수 있습니다.

예제 코드

#include <bits/stdc++.h>
using namespace std;

int main() {
    int arr[] = {1, 2, 3, 4, 5}; // 주어진 배열

    // 배열 크기 계산: 전체 바이트 수 ÷ 요소 하나의 바이트 수
    int size = sizeof(arr) / sizeof(int);

    cout << size << "\n"; // 배열의 요소 개수 출력
    return 0;
}

실행 결과

5

먼저 sizeof(arr)로 배열 전체가 차지하는 메모리(20바이트)를 구한 뒤, 이를 요소 타입인 int의 크기(4바이트)로 나누어 배열의 요소 개수인 5를 얻습니다. 이 방법은 배열을 반복문으로 순회하거나 범위를 결정할 때 매우 유용하게 사용됩니다.

활용 사례 2: 동적 메모리 할당

sizeof 연산자의 두 번째 중요한 용도는 동적 메모리 할당(dynamic memory allocation)입니다. malloc()이나 calloc()으로 메모리를 할당할 때 필요한 바이트 수를 계산하는 데 sizeof가 활용됩니다.

예제 코드

#include <bits/stdc++.h>
using namespace std;

int main() {
    // int 크기(4바이트) × 10개 블록 = 총 40바이트 할당
    int* ptr = (int*)malloc(10 * sizeof(int));

    free(ptr); // 사용 후 메모리 해제
    return 0;
}

sizeof(int)가 4바이트이므로 10개의 int 블록을 위해 총 40바이트의 메모리가 할당됩니다. 이처럼 하드코딩된 숫자 대신 sizeof를 사용하면 시스템마다 타입 크기가 달라지더라도 코드가 올바르게 동작하므로 이식성(portability)이 높아집니다. 참고로 현대 C++에서는 malloc보다 new/delete 연산자를 사용하는 것이 더 안전하고 권장되는 방식입니다.

마무리

이번 글에서는 C++의 sizeof 연산자가 무엇인지, 어떻게 동작하는지 살펴보고, 기본 타입 크기 확인, 표현식 평가 방식, 배열 크기 계산, 동적 메모리 할당 등 다양한 활용 사례를 예제 코드와 함께 알아보았습니다. sizeof는 메모리를 직접 다루는 저수준 프로그래밍에서 필수적인 도구이므로 그 동작 원리를 정확히 이해해 두는 것이 좋습니다. 이 글이 여러분의 학습에 도움이 되었기를 바랍니다.