C++ 포인터 간단한 질문!

조회수 830회
typedef struct tagNode
{ 
  int data;
  struct tagNode* NextNode;
} Node;

위 구조체 Node에 대하여

sizeof(Node) : 8 Byte
sizeof(Node*) : 4Byte

로 할당되더군요

1) Node의 주소 용량 4바이트는 어떻게 결정된 것인가요?

2) Node의 용량 8바이트는 int data 4바이트 + Node 주소 + 4바이트 해서 8바이트로 된 것이겠죠?

2 답변

  • 포인터는 데이터의 크기가 아니라 메모리 주소를 가지고 있는 변수 입니다.

    메모리 주소이므로 32비트 os 라면 4바이트이고 64비트 os라면 8버이트 크기입니다. 포인터는 단순히 해당 변수가 가리키는 메모리 주소를 가지고 있는 겁니다.

    32비트 기준으로 프로세스는 총 4기가의 메모리를 사용할 수 있습니다. 왜 4기가를 사용할 수 있는가? 32비트이므로 2에 32승개의 크기를 가질 수 있고 2에32승은 4기가 입니다.

    즉 주소크기가 4바이트이어야 4기가의 메모리 주소를 표현할 수 있습니다.

  • 1) Node의 주소 용량 4바이트는 어떻게 결정된 것인가요?

    C 또는 C++에서 포인터의 크기는 실행되는 시스템의 주소체계에 따라 다릅니다. 통상 OS가 32비트냐 64비트냐 라는 말을 하게되는데, 이때의 비트크기가 주소의 크기가 됩니다. CPU에서 사용하는 주소 체계가 몇비트로 설정되어 있냐에따라 몇 비트의 OS를 사용해야하는지가 결정되기 때문에 하드웨어 특성도 관련이있기는 합니다.

    Node*는 주소를 표현하는 포인터 타입입니다. 따라서 32비트 시스템이였다면 sizeof(Node*)의 크기는 4바이트가 될 것입니다.

    C++에서 대부분의 포인터의 크기는 sizeof(void*)와 동일합니다. 즉, sizeof(void*)sizeof(Node*)sizeof(int*) 모두 동일한 크기를 갖습니다. 허나 경우의 따라 sizeof(void*)보다 클경우도 존재하긴 합니다.

    2) Node의 용량 8바이트는 int data 4바이트 + Node 주소 + 4바이트 해서 8바이트로 된 것이겠죠?

    네 맞습니다.

    다만 int는 고정 크기 타입이 아니기 때문에 시스템에 따라 4바이트 일수도 2바이트일 수도 있습니다. 그리고 앞서 말씀드렸듯이 Node*의 크기는 시스템마다 다르기 때문에 sizeof(Node)의 크기가 반드시 8바이트라 할 수는 없습니다.

    현재 시스템이 LP32, IP32, ILP32, LLP64, LP64의 모델을 따르고있는지를 확인하면 명확해 집니다. https://en.cppreference.com/w/cpp/language/types#Properties 이 링크를 참고해 보세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)