-
포인터의 크기는 어떻게 결정될까?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자리를 저장할 공간이 필요한 것과 같은 원리입니다.
'Programming🧑💻 > Cpp' 카테고리의 다른 글
콜 스택 동작을 통해 알아보는 함수 호출 (0) 2025.02.04 이중 포인터 (0) 2025.02.01 포인터도 타입이 필요한 이유 (0) 2025.01.31 변수와 포인터 (0) 2025.01.30