Programming🧑‍💻/Cpp

포인터의 크기는 어떻게 결정될까?

생각 깎는 아이 2025. 2. 3. 23:48

변수는 변수를 선언할때 지정한 타입에 따라 값을 저장하기 위해 사용할 수 있는 메모리의 양이 결정됩니다. 

예를 들어 일반적인 경우 char 의 경우에는 1byte , int의 경우에는 4byte가 해당 변수를 위한 메모리 공간으로 할당됩니다. 

그렇다면 포인터 자체의 크기는 어떻게 될까요?

 

이 질문에 답하기 위해 간단한 C++ 코드를 작성하여 실행하면 32 비트 시스템에서는 모든 포인터가 4바이트, 64 비트 시스템에서는 모든 포인터가 8바이트로 출력됩니다. 비트 시스템은 뭐고 왜 이런 결과가 나오게 되는 걸까요?

#include <iostream>
using namespace std;

int main() {
    // 다양한 타입의 포인터 선언
    int* intPtr;
    char* charPtr;
    double* doublePtr;
    long long* llPtr;
    
    // 각 포인터의 크기 출력
    cout << "int 포인터 크기: " << sizeof(intPtr) << " bytes" << endl;
    cout << "char 포인터 크기: " << sizeof(charPtr) << " bytes" << endl;
    cout << "double 포인터 크기: " << sizeof(doublePtr) << " bytes" << endl;
    cout << "long long 포인터 크기: " << sizeof(llPtr) << " bytes" << endl;
    
    return 0;
}

 

비트 시스템이란?

비트 시스템이란 CPU가 한 번에 처리할 수 있는 데이터의 크기를 의미합니다.

이는 마치 컴퓨터가 가진 '숟가락'의 크기와 같습니다.

32비트 시스템은 한 번에 32비트(4바이트)를 처리할 수 있는 숟가락을, 64비트 시스템은 64비트(8바이트)를 처리할 수 있는 큰 숟가락을 가진 것과 같습니다.

 

비트 시스템과 메모리 주소 범위 

이 숟가락의 크기는 컴퓨터의 모든 부분에 영향을 미칩니다.

특히 중요한 것은 CPU가 메모리와 대화할 때 사용하는 '주소 버스'입니다.

주소 버스는 CPU가 메모리의 특정 위치를 찾아갈 때 사용하는 길과 같습니다.

 

32비트 시스템에서는 이 길이 32개의 선으로 이루어져 있어, 최대 2^32개(약 43억)의 서로 다른 메모리 위치를 구분할 수 있습니다. 이는 총 4GB의 메모리까지만 직접 접근할 수 있다는 의미입니다.

64비트 시스템에서는 이 길이 64개의 선으로 이루어져 있어, 이론적으로는 2^64개의 메모리 위치를 구분할 수 있습니다. 이는 실제로 우리가 현재 사용하는 메모리의 크기보다 훨씬 큰 용량입니다.

 

이것이 바로 포인터의 크기가 시스템에 따라 달라지는 이유입니다.

포인터는 메모리의 주소를 저장하는 변수이므로, 시스템이 사용 가능한 주소 범위를 모두 포함할 수 있는 공간이 필요합니다.

32비트 시스템에서는 4바이트, 64비트 시스템에서는 8바이트가 필요한 것입니다.

 

이는 마치 우편번호 시스템과 비슷합니다. 3자리 우편번호 체계에서는 3자리 숫자만 저장할 수 있는 공간이 필요하고, 5자리 우편번호 체계에서는 5자리를 저장할 공간이 필요한 것과 같은 원리입니다.