Pointer의 크기는 아키텍쳐의 크기에 따라 다르다.

포인터

Pointer란 먼저 주소를 담는 자료형이다. 즉, 주소 0x00000000를 담기 위해서 필요한 것이다. 이 주소에 접근해서 다양한 계산을 할 수 있다.

여기서 중요한 것은 포인터의 크기이다. 하나의 포인터는 자료형의 크기를 따라가는 것이 아니라 아키텍쳐가 다룰 수 있는 최대 크기를 따라간다는 점을 파악해야 한다.

예를 하나 들어보겠다.

#include <bits/stdc++.h>

using namespace std;



int main() {

int a = 0;

double c= 3.1;



double* b = &c;

int* d = &a;

cout << b << "\n" ;



cout << sizeof(b) << "\n" ;

cout << sizeof(d) << "\n" ;



}

다음과 같이 포인터를 이용해서 그 포인터의 크기를 출력하는 코드가 있다.
b의 자료형은 double형이고, d의 자료형은 int형이기 때문에 당연하게도 b의 sizeof는 8bytes, d의 크기는 4bytes같다.

하지만 위에서 말했듯이 자료형의 크기는 아키텍처가 다룰 수 있는 최대 크기를 따라가기 때문에 b와 d 모두 8bytes의 크기를 가지게 된다.

좀 더 자세히 접근해 보자.

메모리주소

메모리 주소 관점에서 하나의 메모리셀의 크기는 1byte를 의미한다.
즉, int 자료형 하나를 표현하기 위해서는 이러한 메모리셀이 4개나 필요하다는 것이다.
이를 포인터에 적용시켜보자.
정수형의 경우 메모리셀을 4개나 잡고 있어야 저장이 가능하다.
그렇다면 주소를 담기 위해서는 몇개나 필요할까 ?
이것이 핵심이다.

주소는 32bit의 경우에는 0x00000000~0xffffffff까지 표현이 가능하다.(4bit * 8)
더 나아가서는 64bit의 경우에는 0x0000000000000000~0xffffffffffffffff까지 표현이 가능하다.(4bit * 16 )

즉, 이러한 주소를 담기 위해서는 아키텍처, 그리고 OS마다 다른 크기를 가져야 가능하다. 표현범위가 같은 경우에는 같은 크기를 지니게 된다.

결론

32bit의 경우에는 16진수로 총 8자리의 수를 가져야 한다. 즉, 최대 4bytes의 크기를 지닌다.
64bit의 경우에는 16진수로 총 16자리의 수를 가져야 한다. 즉, 최대 8bytes의 크기를 지니게 된다.

위의 경우에는 m1 macOS 64bit체제에서 실행시켰다.
따라서 다음과 같은 결과를 얻을 수 있었다.

0x16b786d80
8
8

Categories:

Updated:

Leave a comment