일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Tips프로그래밍강좌
- Tips강좌
- 배열
- c++
- Desktop
- CS
- 알고리즘
- Direct2D
- 연산자
- 티스토리
- Windows
- 김성엽
- 포인터
- c
- 문법
- doit코틀린프로그래밍
- 지식나눔강좌
- Javascript
- 함수
- c#
- Visual Studio
- Programming
- 백준
- Kotlin
- 리뷰
- 프로그래밍
- Win32
- tipssoft
- 이지스퍼블리싱
- VS ERROR
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
포인터의 크기 본문
자료형은 저마다 크기가 존재합니다. C언어의 기중 중 하나로 볼 수 있는 포인터도 예외는 아닌데요, 포인터의 크기는 어떻게 정해졌는지 알아봅니다.
프로그램 버전에 종속적
아래 포스트에서 잠깐 언급한 적이 있습니다.
지금 개발 중인 프로그램이 32비트라면 포인터는 4Byte, 64비트 프로그램이라면 포인터는 8Byte로 크기가 고정됩니다. 이 크기는 각 운영체제에서 가용할 수 있는 최대 메모리 크기와도 연관됩니다.
이론상 32비트 운영체제는 4GB, 64비트 운영체제는 16EB까지 RAM을 확장할 수 있습니다. 운영체제는 메모리를 효율적으로 관리하기 위해 특정 단위로 메모리를 관리합니다. 그 단위로 Byte를 사용합니다. Byte는 C언어에서 char 타입으로 명명된 크기입니다. 즉, 1Byte 단위로 메모리를 관리[# OS에서 관리하는 단위가 그렇다는 것입니다. bit 단위에 접근하기 위해 bit 연산자를 제공합니다.]하는 것이죠.
4GB를 Byte로 변환해보겠습니다.
4(GB) = 4 * 1024^3 = 4,294,967,296
16EB를 Byte로 변환해보겠습니다.
16(EB) = 16 * 1024^6 = 18,446,744,073,709,551,616
각 크기를 Byte 단위로 관리하려면 이 수들을 관리할 수 있어야 합니다.
이 글에서 UINT_MAX(혹은 ULONG_MAX)와 ULLONG_MAX를 보겠습니다.
최댓값은 해당 자료형이 표현할 수 있는 가장 큰 수입니다. 달리 이야기하면 MAX 값의 + 1[# 값이 0인 경우] 가지의 경우 중 한 가지를 저장할 수 있다는 말이 됩니다.
그래서 포인터가 32비트 운영체제에서는 32비트인 int[# 혹은 long] 크기로, 64비트에서는 long long 크기로 표현되는 것입니다. 그러나 64비트 운영체제에서는 32비트 프로그램을 실행할 수 있습니다. 호환성을 지원하기 때문입니다. 그래서 운영체제의 버전에 따라 포인터가 결정된다고 보기보단, 프로그램을 개발할 때 몇 비트 프로그램으로 개발했는지로 판단해야 합니다.
'DEV > C C++' 카테고리의 다른 글
구조체(struct) part2. 비트 필드 (0) | 2020.01.29 |
---|---|
공용체(union) part1. default (0) | 2020.01.28 |
포인터 배열? 배열 포인터? (0) | 2020.01.26 |
다차원 배열의 요소 값 교환하기 (0) | 2020.01.25 |
포인터와 배열 (0) | 2020.01.24 |