답변:
참조 http://www.gotw.ca/gotw/009.htm을 ; 힙과 무료 저장소의 차이점을 나보다 훨씬 더 잘 설명 할 수 있습니다.
무료 매장 :
무료 저장소는 새로 만들기 / 삭제에 의해 할당 / 해제되는 두 개의 동적 메모리 영역 중 하나입니다. 객체 수명은 스토리지가 할당 된 시간보다 짧을 수 있습니다. 즉, free store 객체는 즉시 초기화되지 않고 메모리를 할당 할 수 있으며 메모리가 즉시 할당 해제되지 않고 파괴 될 수 있습니다. 스토리지가 할당되었지만 객체의 수명을 벗어난 기간 동안에는 void *를 통해 스토리지에 액세스하고 조작 할 수 있지만 프로토 오브젝트의 비 정적 멤버 또는 멤버 함수에 액세스하거나 주소를 가져 오거나 조작 할 수 없습니다. .
더미:
힙은 malloc / free 및 그 변형에 의해 할당 / 해제되는 다른 동적 메모리 영역입니다. 기본 전역 new 및 delete는 malloc 측면에서 구현되고 특정 컴파일러에 의해 해제 될 수 있지만 힙은 여유 저장소와 동일하지 않으며 한 영역에 할당 된 메모리를 다른 영역에서 안전하게 할당 해제 할 수 없습니다. 힙에서 할당 된 메모리는 배치-새 구성 및 명시 적 소멸을 통해 클래스 유형의 개체에 사용할 수 있습니다. 사용하는 경우 무료 저장소 개체 수명에 대한 참고 사항이 여기에 유사하게 적용됩니다.
C ++의 경우 무료 저장소와 힙의 차이가 순전히 개념적이되었습니다. 벌레를 모으기위한 항아리와 쿠키를 모으기위한 항아리처럼. 하나는 한 방향으로, 다른 하나는 레이블이 지정됩니다. 이 지정은 " new
"및 " delete
"을 " malloc
", " realloc
"또는 " free
"(또는 해당 문제에 대한 비트 레벨 세트) 와 절대 혼합하지 않는 지점으로 이동 하기위한 것입니다.
인터뷰하는 동안 그것의 좋은 그런 말을 "로 new
하고 delete
무료 저장소를 사용 malloc
하고 free
힙을 사용합니다 new
하고 delete
있지만, 각각 생성자와 소멸자를 호출 malloc
하고 free
하지 않습니다." 그러나 메모리 세그먼트가 실제로 동일한 영역에 있다는 말을 자주 듣게 될 것입니다. 그러나 컴파일러에 따라 다를 수 있습니다. 그러나).
Mike Koval의 답변은 이론을 아주 잘 다루고 있습니다. 그러나 실제로는 거의 항상 동일한 메모리 영역입니다. 대부분의 경우 컴파일러의 구현을 살펴보면new
, 당신은 호출을 찾을 수 있습니다 malloc()
.
즉, 머신의 관점에서 볼 때 힙과 여유 저장소는 동일합니다. 컴파일러 내부에 차이가 있습니다.
상황을 더욱 혼란스럽게 만들기 위해 C ++의 출현 이전에 우리는 "힙"을 지금 "무료 저장소"라고 부르는 것을 의미한다고 말했습니다.
힙과 무료 저장소는 상호 운용 할 수 없습니다. C ++ 11 표준 라이브러리를 사용하는 AVR 8 비트 마이크로 컨트롤러와 같은 제한된 컨텍스트에서는 동일한 프로그램에서 사용할 수도 없습니다. Free store 및 heap은 동일한 메모리 공간에서 할당을 수행하여 서로 구조와 데이터를 덮어 씁니다. 이 맥락에서 Free store는 "new / delete free store library"가 "Malloc / free / realloc / calloc 힙 라이브러리"보다 더 간단하고 빠르기 때문에 힙과 다르며 호환되지 않습니다. C ++ 임베디드 프로그래머 (512 바이트 RAM 만있는 컨텍스트에서).
https://github.com/ambroise-leclerc/ETL/tree/master/libstd 에서 8 비트 C ++ 11 / 14 표준 라이브러리를 참조하십시오.