이 두 영역이 서로 다른 사용 사례에 최적화되어 있습니다.
스택은 개체가 FIFO 순서로 할당 해제되는 경우에 최적화됩니다. 즉, 최신 개체는 항상 이전 개체보다 먼저 할당됩니다. 이 때문에, 거대한 바이트 배열을 유지 한 다음 끝에 바이트를 전달하거나 취소하여 메모리를 신속하게 할당하고 할당을 취소 할 수 있습니다. 함수 호출을위한 지역 변수를 저장하는 데 필요한 메모리는 항상 이러한 방식으로 재사용되기 때문에 (함수는 항상 호출 된 역순으로 실행이 끝나기 때문에) 스택은 이러한 종류의 메모리를 할당하기에 좋은 장소입니다.
그러나 스택은 다른 종류의 할당을 수행하는 데 적합하지 않습니다. 가장 최근에 할당 된 블록이 아닌 스택에서 할당 된 메모리를 쉽게 할당 해제 할 수 없습니다. 스택에서 "간격"이 발생하고 바이트를 사용할 수있는 위치를 결정하는 논리가 복잡해지기 때문입니다. 이러한 종류의 할당의 경우 개체가 할당 된 시간부터 개체 수명을 확인할 수없는 경우 힙은 개체를 저장하기에 더 좋습니다. 힙을 구현하는 데는 여러 가지 방법이 있지만 대부분의 경우 적절한 크기의 메모리를 쉽게 찾을 수 있도록 할당 된 블록의 거대한 테이블 또는 연결된 목록을 클라이언트에 다시 저장하는 아이디어에 의존합니다. 메모리가 해제되면 테이블 또는 링크 된 목록에 다시 추가되며 다른 블록과 함께 블록을 압축하기 위해 다른 논리가 적용될 수 있습니다. 검색 시간의 오버 헤드로 인해 힙은 일반적으로 스택보다 훨씬 느립니다. 그러나 스택은 일반적으로 스택이 좋지 않은 패턴으로 할당을 할 수 있으므로 일반적으로 두 개가 모두 프로그램에 있습니다.
흥미롭게도 두 가지 중간에있는 메모리를 할당하는 다른 방법이 있습니다. 하나의 일반적인 할당 기법은 "arena"라고하는 무언가를 사용합니다. 스택에서와 같이 하나의 큰 메모리 덩어리가 힙에서 할당 된 다음 작은 블록으로 분할됩니다. 이것은 할당이 순차적이면 (예를 들어, 같은 길이의 모든 작은 객체를 할당하려고하는 경우) 할당 영역이 매우 빠르지 만 객체가 특정 함수 호출보다 오래 머무를 수 있다는 이점을 제공합니다 .다른 많은 접근법이 존재하며 이는 가능한 작은 샘플링 일 뿐이지 만 메모리 할당은 모두 단점에 관한 것임을 분명히해야합니다. 특정 요구에 맞는 할당자를 찾아야합니다.
무엇 때문에 효율적입니까? – Anycorn
달라질 수 있습니다 ..... –
NARQ로 투표하려면 투표하십시오. –