Heap이 Stack에 비해 느릴 수 밖에 없는 이유
"스택이 힙보다 빠르다" 라는 표현은 모호한 표현입니다.
정확한 표현은 "스택에 할당된 변수에 접근하는 것이 힙에 할당된 변수에 접근하는 것보다 빠르다" 입니다.
왜냐하면, 스택과 힙 모두 가상 메모리에 불과하기 때문인데요.
하드웨어로 내려가면 똑같이 물리 메모리인 RAM 어딘가에 저장되어 있고, 주소를 통해 논리적으로 구분되어 있기 때문에 둘의 속도가 다를 수 없습니다.
그렇다면 접근하는 속도가 왜 차이 날까?
현재 사용되는 대부분의 CPU는 FP(Frame Pointer)를 두어 함수의 스택 프레임의 시작주소를 저장하고 있습니다.
그리고 컴파일러는 컴파일 과정을 통해 함수의 스택 프레임 내에 변수들의 크기와 순서를 알 수 있기 때문에, 어느 위치(offset)에 위치할 지 알 수 있습니다.
void example_function() {
int a; // 4 bytes
char b; // 1 byte
float c; // 4 bytes
}
|-------------------| <-- 1000
| return address |
|-------------------| <-- 999
| old FP |
|-------------------| <-- 998 (new FP)
| c | <-- 997 (FP - 1)
|-------------------|
| padding |
|-------------------|
| b | <-- 996 (FP - 2)
|-------------------|
| padding |
|-------------------|
| a | <-- 995 (FP - 3)
|-------------------|
위 예시처럼 스택에 할당된 변수들은 주소를 빠르게 계산할 수 있습니다. 접근하려는 변수의 offset을 알고 있고 FP에 스택 프레임의 시작 주소가 저장되어 있어 FP + offset
라는 간단한 공식을 통해 변수에 접근이 가능합니다.
즉, 한번의 add와 load 명령으로 스택 내 변수의 값을 읽을 수 있습니다.
반면, 힙에 할당된 변수는 힙의 어떤 offset에 저장될지 컴파일 타임에 알 수 없기 때문에, OS로부터 할당받은 힙 내 주소를 스택 변수에 저장해야 합니다.
따라서, 힙 내 변수의 값에 접근하려면 스택에서 힙 주소를 읽어오기 위한 add -> load 명령과, 그 주소를 사용해 실제 값을 읽어오기 위한 추가 load 명령이 필요합니다.
정리
힙에 할당된 변수에 접근하려면 스택에 할당된 변수에 접근하는 것보다 load 명령이 한번 더 필요하기 때문에 느릴 수 밖에 없다고 정리하면 될 것 같습니다!
'CS' 카테고리의 다른 글
SQL 기본 쿼리문 정리 (0) | 2024.08.05 |
---|---|
객체 지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜야 한다. (0) | 2024.04.12 |
[컴퓨터 구조] 시스템 버스(System Bus) 및 동작 방식 (0) | 2024.03.12 |
[소프트웨어 공학] 블랙박스 테스트-1 (0) | 2022.11.07 |
[소프트웨어 공학] JUnit (0) | 2022.10.10 |