왜 8테라바이트일까? 나는 64비트 프로세서가 16엑사바이트를 처리할 수 있다고 생각했다!
할 수 있다. 다만, 사용자 공간을 제한하는 것은 대부분 실용적인 이유 때문이다. 작은 메모리 범위에 대한 가상 메모리 매핑 테이블을 만들면 리소스 소모가 적어지고 운영 체제에서도 빨라진다. 예를 들어 프로세스를 전환할 때 메모리 전체를 다시 매핑해야 하며, 주소 공간이 클수록 이 속도는 느려진다. 앞으로 8테라바이트 RAM이 보편화된다면 사용자 공간 범위를 늘리는 것이 가능하겠지만, 그 전에는 8테라바이트까지가 우리의 한계다.
포인터는 기본적으로 메모리의 주소를 가리키는 숫자이다. 실제 데이터 대신 포인터를 사용할 때의 장점은 불필요한 중복을 방지한다는 것이다. 하지만 이는 상당히 큰 연산을 요구할 수 있다. 우리는 포인터라는 주소를 전달함으로써 함수 간에 기가바이트의 데이터를 전달할 수 있다. 그렇지 않으면 모든 함수 호출 시 기가바이트의 메모리를 복사해야 한다. 포인터를 사용하면 숫자 하나만 복사하면 된다.
당연히 포인터 자체보다 크기가 작은 데이터를 위해 포인터를 사용하는 것은 말이 안 된다. 32비트 정수(C#의 int)는 64비트 시스템의 포인터 크기의 절반에 불과하다. 따라서 int, long, bool, byte와 같은 원시 타입은 모두 값 타입으로 간주한다. 즉, 이러한 타입의 변수는 주소에 대한 포인터 대신 그 값만 함수에 전달한다는 것을 의미한다.