64비트 기반 프로그램과 32비트 기반 프로그램의 차이

32비트 / 64비트는 기본적으로 CPU가 한 번에 다루는 데이터 단위와 주소 표현 크기를 기준으로 구분된다.

1. 주소 표현 범위 차이

32비트 프로그램은 포인터 크기가 보통 4바이트이므로 표현 가능한 주소 범위가 제한된다.

  • 32비트 주소 공간: 약 4GB
  • 64비트 주소 공간: 이론적으로 훨씬 더 큰 주소 공간 표현 가능

따라서 64비트 프로그램은 더 큰 메모리 공간을 사용할 수 있다.

2. 포인터 크기 차이

32비트 프로그램에서는 포인터가 보통 4바이트이고, 64비트 프로그램에서는 포인터가 보통 8바이트이다.

이 차이 때문에 같은 구조체라도 64비트 환경에서는 크기가 더 커질 수 있다.

3. 레지스터 크기와 처리 단위 차이

64비트 CPU는 64비트 레지스터를 사용하여 더 큰 정수나 주소 값을 한 번에 처리할 수 있다.

다만 모든 연산이 무조건 2배 빨라지는 것은 아니다. 프로그램 특성에 따라 성능 차이는 달라진다.

4. 호출 규약과 스택 사용 방식 차이

64비트 환경에서는 함수 인자 전달 방식, 스택 정렬, 레지스터 사용 방식 등이 32비트 환경과 다르다.

예를 들어 Windows x64에서는 일부 인자를 스택이 아니라 레지스터로 먼저 전달한다.

5. 프로그램 호환성 차이

64비트 운영체제는 보통 32비트 프로그램을 실행할 수 있지만, 32비트 프로그램은 64비트 DLL을 직접 사용할 수 없다.

반대로 64비트 프로그램도 32비트 DLL을 직접 로드할 수 없다.

64비트 관련 면접 질문

  1. 구조체 정렬이 64비트에서 왜 더 중요해지나요?
  2. 64비트로 가면서 성능이 좋아질 수도 있고 나빠질 수도 있는 이유는? 64비트 환경에서는 레지스터 크기가 커지고, x64에서는 사용할 수 있는 레지스터 개수도 늘어나서 함수 호출이나 계산 처리에서 이점이 생길 수 있다. 하지만 포인터 크기가 4바이트에서 8바이트로 커지기 때문에, 포인터를 많이 가진 자료구조는 메모리 사용량이 증가. 그 결과 캐시에 담을 수 있는 데이터 수가 줄어들고, 캐시 미스가 늘어나면 오히려 성능이 떨어질 수 있음.
  3. LLP64 vs LP64 모델 차이를 설명해보세요 LP64와 LLP64는 64비트 환경에서 자료형 크기를 정하는 ABI 모델. 핵심 차이는 long의 크기. LP64는 long과 pointer가 8바이트이고, Linux/macOS 계열에서 주로 사용됨
    LLP64는 long long과 pointer가 8바이트이고, long은 4바이트로 유지되며 Windows에서 사용됨.
    따라서 64비트라고 해서 모든 long이 8바이트라고 가정하면 이식성 문제가 생길 수 있음.