Dev.YoungKyu
YoungKyu's Devlog
전체 방문자
오늘
어제
  • 분류 전체보기
    • 부스트캠프
    • visionOS
    • iOS
    • 알고리즘
    • CS
    • Git
    • Python
    • 끄적끄적

블로그 메뉴

  • 홈
  • 🌝 티스토리 홈
  • ⭐️ 깃허브
  • 태그

공지사항

인기 글

최근 댓글

최근 글

태그

  • 소프트웨어공학
  • ImageResource
  • constraint
  • 티스토리챌린지
  • jekyll
  • ios
  • 백준
  • boj
  • MVC
  • avaudiosessionportdescription
  • 부스트캠프
  • Concurrency
  • image
  • Git
  • Animation
  • guard
  • if let
  • Optional
  • AutoLayout
  • 오블완
  • Python
  • Swift5.7
  • 알고리즘
  • 모듈화
  • SwiftUI
  • AVAudioSession
  • 소프트웨어 공학
  • swift
  • 소프트웨어 테스트
  • CS

티스토리

hELLO · Designed By 정상우.
Dev.YoungKyu
CS

Heap이 Stack에 비해 느릴 수 밖에 없는 이유

2024. 7. 21. 19:02

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' 카테고리의 다른 글

Audio 기본 지식 이해하기(Sample, Frame, Sampling Rate, Channel, Bit Depth)  (0) 2025.03.31
SQL 기본 쿼리문 정리  (0) 2024.08.05
객체 지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜야 한다.  (0) 2024.04.12
[컴퓨터 구조] 시스템 버스(System Bus) 및 동작 방식  (1) 2024.03.12
[소프트웨어 공학] 블랙박스 테스트-1  (1) 2022.11.07
    'CS' 카테고리의 다른 글
    • Audio 기본 지식 이해하기(Sample, Frame, Sampling Rate, Channel, Bit Depth)
    • SQL 기본 쿼리문 정리
    • 객체 지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜야 한다.
    • [컴퓨터 구조] 시스템 버스(System Bus) 및 동작 방식
    Dev.YoungKyu
    Dev.YoungKyu
    iOS를 공부하고 있습니다

    티스토리툴바