스택 : 스택은 현재 실행중인 코드 블록과 현재 블록이라고하는 블록과 그 블록을 호출 한 블록 등에서 사용하기위한 일종의 임시 스크래치 패드로 사용됩니다. 현재 블록이 종료되면 사용중인 로컬 변수는 잊어 버리게됩니다. 이름에서 알 수 있듯이 스택은 마지막 선입 선출 방식으로 사용됩니다.
스택의 가장 중요한 용도 중 하나는 현재 호출 체인을 추적하는 것입니다. 한 함수가 다른 함수를 호출 할 때 호출자는 다음 명령어의 주소 (반환 주소)를 스택에 푸시합니다. 각 함수가 종료되면 호출자의 리턴 주소가 스택에서 꺼내고 그 주소에서 시작하는 코드를 계속 실행합니다. 또한 함수 매개 변수를 전달하고 호출자와 수신자간에 값을 전달하는데도 사용됩니다.
힙 : 힙은 다릅니다. 특별한 순서는 없습니다. 한 블록의 코드에 메모리를 할당하고 해당 블록의 끝을 넘어서 메모리를 사용하려면 힙에 할당해야합니다. 물론, 다른 코드가 메모리를 찾을 수 있도록 포인터/참조를 어딘가에 저장해야합니다. 대부분의 언어는 그 조절을 제공합니다.
속도 : 속도의 차이는 메모리 자체의 특성 때문이 아닙니다. 질문에서 말한 것처럼 스택과 힙 모두 일반적으로 동일한 실제 메모리에 존재합니다. 스택에 공간을 할당하는 것은 스택이 빠르기 때문에 빠릅니다. LIFO 특성 : 스택에 무언가를 밀어 넣으면 끝낼 수있는 곳이 하나뿐입니다. 반대로 힙에 블록을 할당하려면 메모리에서 충분히 큰 연속 자유 영역을 찾아야합니다. 스택 할당은 단일 명령어만큼 빠릅니다. 힙 할당은 malloc()
과 같은 메모리 할당 함수를 호출해야합니다.
정적 정적 동적 : 힙의 메모리 할당은 동적입니다. 블록을 할당할지 여부와 블록의 크기는 프로그램 실행 중에 입력에 따라 결정할 수 있습니다. 힙에 할당 된 메모리 영역은 필요한 경우 크기를 조정할 수도 있습니다. 도 동적으로 스택에 메모리를 할당 할 수 있지만 (C 표준 라이브러리 함수 alloca()
참조) 현재 함수가 종료 되 자마자 해당 메모리가 손실됩니다. 스택 할당은 대개 정적입니다. 컴파일러는 (등록되지 않은) 매개 변수, 반환 데이터 및 로컬 변수에 필요한 공간을 결정하고 함수가 호출 될 때 스택에 필요한 공간을 예약하는 코드를 생성합니다.
예 : 워드 프로세서를 생성한다고 가정 해보십시오. 문서가 얼마나 큰지 미리 알 수 없으며, 동시에 얼마나 많은 문서가 사용될 지 알 수 없습니다. 동시에 사용자가 문서를 열어두기를 원할 때까지는 사용자 문서가 메모리에 남아 있기를 원합니다. 스택에있는 문서에 메모리를 할당하려고하면 한 번에 두 개 이상의 문서를 열지 못하기 때문에 문서를 작성, 편집, 저장 및 닫는 단일 함수를 만들어야합니다. 힙에 공간을 할당하면 원하는만큼 많은 문서를 만들 수 있습니다. 각각의 문서는 포함 된 데이터에 맞게 크기가 정해지고 특정 기능의 수명이 다할 때까지 문서의 수명이 다하는 것을 피할 수 있습니다.
요약 :요약하면 스택에는 현재 블록의 수명이 다 된 메모리를 할당하는 데 사용되는 변수 값 (레지스터가 사용되는 경우도 있음)이 포함됩니다.
http://stackoverflow.com/questions/7123936/why-is-there-a-stack-and-heheap – drdwilcox
http://stackoverflow.com/questions/79923/what-and-where-are -the-stack-and-heap –