C ++, 프리 스토어 vs 힙


124

의 동적 할당 new/deletefree-store 에서 발생
하는 반면 malloc/free작업은 heap을 사용합니다 .

실제로 실제 차이가 있는지 알고 싶습니다.
컴파일러는 두 용어를 구분합니까? ( 무료 저장소 이 아님 new/malloc)

답변:


76

참조 http://www.gotw.ca/gotw/009.htm을 ; 힙과 무료 저장소의 차이점을 나보다 훨씬 더 잘 설명 할 수 있습니다.

무료 매장 :

무료 저장소는 새로 만들기 / 삭제에 의해 할당 / 해제되는 두 개의 동적 메모리 영역 중 하나입니다. 객체 수명은 스토리지가 할당 된 시간보다 짧을 수 있습니다. 즉, free store 객체는 즉시 초기화되지 않고 메모리를 할당 할 수 있으며 메모리가 즉시 할당 해제되지 않고 파괴 될 수 있습니다. 스토리지가 할당되었지만 객체의 수명을 벗어난 기간 동안에는 void *를 통해 스토리지에 액세스하고 조작 할 수 있지만 프로토 오브젝트의 비 정적 멤버 또는 멤버 함수에 액세스하거나 주소를 가져 오거나 조작 할 수 없습니다. .

더미:

힙은 malloc / free 및 그 변형에 의해 할당 / 해제되는 다른 동적 메모리 영역입니다. 기본 전역 new 및 delete는 malloc 측면에서 구현되고 특정 컴파일러에 의해 해제 될 수 있지만 힙은 여유 저장소와 동일하지 않으며 한 영역에 할당 된 메모리를 다른 영역에서 안전하게 할당 해제 할 수 없습니다. 힙에서 할당 된 메모리는 배치-새 구성 및 명시 적 소멸을 통해 클래스 유형의 개체에 사용할 수 있습니다. 사용하는 경우 무료 저장소 개체 수명에 대한 참고 사항이 여기에 유사하게 적용됩니다.


23
동의하지 않습니다. 동적 할당의 맥락에서 "힙"이라는 단어는 C ++ 표준이나 C99에서 사용되지 않습니다. 문제의 GotW가 게시 된 날짜를 찾을 수 없었지만 초안에 대해 이야기하기 때문에 분명히 사전 표준입니다.
avakar

2
이것은 용어의 모든 문제입니다, imho. 말해봐, 미스터. Stroustrup은 'heap'과 'free store'를 구분하지 않습니다. stroustrup.com/Programming/17_free_store.ppt , slide 12. 'Heap'은 C ++ 이전에 동적 메모리의 동의어로 사용되었습니다. Lisp 시간 (1960 년대) 이후 메모리 할당을위한 힙 데이터 구조.
알렉세이 Voytenko

나는 일반적으로 힙 (maloc / free를 통해)을 일종의 '원료'공급 업체로 생각합니다. 당신은 기억의 덩어리를 요구합니다. 어떤 구조물도 직접 지어야합니다. Free Store (신규 / 삭제)는 '완제품'공급 업체와 비슷합니다. 개체를 요청하면 공간이 할당되고 사용을 위해 만들어지고 준비된 개체가 할당됩니다. 완료되면 깔끔하게 정리됩니다.
Anshuman Kumar

67

C ++의 경우 무료 저장소와 힙의 차이가 순전히 개념적이되었습니다. 벌레를 모으기위한 항아리와 쿠키를 모으기위한 항아리처럼. 하나는 한 방향으로, 다른 하나는 레이블이 지정됩니다. 이 지정은 " new"및 " delete"을 " malloc", " realloc"또는 " free"(또는 해당 문제에 대한 비트 레벨 세트) 와 절대 혼합하지 않는 지점으로 이동 하기위한 것입니다.

인터뷰하는 동안 그것의 좋은 그런 말을 "로 new하고 delete무료 저장소를 사용 malloc하고 free힙을 사용합니다 new하고 delete있지만, 각각 생성자와 소멸자를 호출 malloc하고 free하지 않습니다." 그러나 메모리 세그먼트가 실제로 동일한 영역에 있다는 말을 자주 듣게 될 것입니다. 그러나 컴파일러에 따라 다를 수 있습니다. 그러나).


28

Mike Koval의 답변은 이론을 아주 잘 다루고 있습니다. 그러나 실제로는 거의 항상 동일한 메모리 영역입니다. 대부분의 경우 컴파일러의 구현을 살펴보면new , 당신은 호출을 찾을 수 있습니다 malloc().

즉, 머신의 관점에서 볼 때 힙과 여유 저장소는 동일합니다. 컴파일러 내부에 차이가 있습니다.

상황을 더욱 혼란스럽게 만들기 위해 C ++의 출현 이전에 우리는 "힙"을 지금 "무료 저장소"라고 부르는 것을 의미한다고 말했습니다.


5

"힙"이라는 용어는 또한 특정 데이터 구조를 지칭 할 수 있지만, C ++ malloc, free, new 및 delete 작업의 맥락에서 "힙"및 "무료 저장소"라는 용어는 어느 정도 상호 교환 적으로 사용됩니다.


3

힙과 무료 저장소는 상호 운용 할 수 없습니다. 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 표준 라이브러리를 참조하십시오.


2

push_heapet al 과 같은 힙 함수에 대한 설명을 제외하고는 힙이라는 단어를 언급 한 표준을 기억하지 못합니다 . 모든 동적 할당은 무료 상점에서 수행됩니다.


1

Free Store는 프로그램 실행 중 동적 할당을 위해 프로그램에서 사용하는 프로그램에 제공되는 할당되지 않은 힙 메모리 풀입니다. 모든 프로그램에는 실행 중에 활용할 수있는 할당되지 않은 힙 메모리 풀이 제공됩니다. 이 사용 가능한 메모리 풀을 프로그램의 여유 저장이라고합니다. 할당 된 여유 저장 메모리는 이름이 지정되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.