Programing

malloc () 대 HeapAlloc ()

lottogame 2020. 12. 27. 10:17
반응형

malloc () 대 HeapAlloc ()


malloc ()과 HeapAlloc ()의 차이점은 무엇입니까? 내가 이해하는 한 malloc은 HeapAlloc과 마찬가지로 힙에서 메모리를 할당합니다.

그렇다면 차이점은 무엇입니까?

감사!


둘 다 힙에서 메모리를 할당하는 것이 맞습니다. 그러나 차이점이 있습니다.

  • malloc() 표준의 일부인 휴대용입니다.
  • HeapAlloc() 이식성이 없으며 Windows API 기능입니다.

그것은 윈도우에 있음을 확실히 가능성 malloc의 상단에 구현 될 것입니다 HeapAlloc. 나는 malloc보다 빠를 것으로 기대 합니다 HeapAlloc.

HeapAlloc보다 유연합니다 malloc. 특히 할당 할 힙을 지정할 수 있습니다. 이는 프로세스 당 여러 힙을 수용합니다.

거의 모든 코딩 시나리오는 사용하는 것 malloc보다는 HeapAlloc. 질문 C ++에 태그를 지정했기 때문에 new!


실제로 malloc () (및 기타 C 런타임 힙 함수)은 모듈 종속적입니다. 즉, 한 모듈 (예 : DLL)의 코드에서 malloc ()을 호출하면 동일한 모듈의 코드 내에서 free ()를 호출해야합니다. 또는 꽤 나쁜 힙 손상을 입을 수 있습니다 (그리고 이것은 잘 문서화되었습니다). malloc () 대신 GetProcessHeap ()과 함께 HeapAlloc ()을 사용하면 new 및 delete 연산자를 사용하는 오버로딩을 포함하여 모듈간에 동적으로 할당 된 객체를 전달할 수 있으며 메모리가 코드에 할당 된 경우 메모리 손상에 대해 걱정할 필요가 없습니다. 메모리 블록에 대한 포인터가 외부 모듈로 전달되면 다른 모듈의 코드에서 해제됩니다.


Visual C ++에서는 함수 malloc()나 연산자가 new결국 HeapAlloc(). 코드를 디버깅하면 _heap_alloc_base()파일에서를 사용하여 생성 된 전역 힙이 어디에 있는지 malloc.c호출 하는 함수를 찾을 수 있습니다.return HeapAlloc(_crtheap, 0, size)_crtheapHeapCreate()

이 함수 HeapAlloc()는 할당 당 최소 8 바이트의 오버 헤드로 메모리 오버 헤드를 최소화하는 좋은 작업을 수행합니다. 내가 본 가장 큰 것은 1 바이트에서 100,000 바이트까지의 할당에 대해 할당 당 15 바이트입니다. 블록이 클수록 오버 헤드가 더 커지지 만 할당 된 전체의 백분율이 페이로드의 2.5 % 미만으로 유지됩니다.

HeapAlloc()사용자 정의 루틴으로 벤치마킹하지 않았기 때문에 성능에 대해 언급 할 수 HeapAlloc()없지만를 사용하는 메모리 오버 헤드에 관한 한 오버 헤드는 놀랍도록 낮습니다.


malloc C 표준 라이브러리 (또한 C ++ 표준 라이브러리)의 함수입니다.

HeapAlloc Windows API 함수입니다.

후자는 할당 할 힙을 지정할 수 있습니다.이 방법은 다른 스레드에서 할당 요청의 직렬화를 피하는 데 유용 할 수 있습니다 ( HEAP_NO_SERIALIZE플래그에 주의 ).

건배 & hth.,


여러 DLL이 올 수 있고 (LoadLibrary / Freelibrary를 통해) 메모리가 하나의 DLL 내에 할당되었지만 다른 DLL에서 해제 될 수있는 시스템에서 (이전 답변 참조) HeapAlloc 및 관련 함수는 성공적인 메모리 공유.

스레드로부터 안전하고 아마도 박사 학위에 의해 고도로 최적화 된 HeapAlloc은 malloc / free를 사용하는 공유 할 수없는 코드가 실패하는 모든 종류의 상황에서 작동하는 것으로 보입니다.

우리는 C ++ 임베디드 샵이므로 코드 이식성을 위해 스텁 (타겟에서) 또는 네이티브 (윈도우로) 할 수있는 HeapAlloc (GetProcessHeap ())을 사용하기 위해 시스템 전반에 걸쳐 new / delete 연산자를 오버로드했습니다.

지금까지는 명백히 DLL처럼 보이는 malloc / free, 각 DLL로드에 대한 새로운 "힙"을 우회했기 때문에 문제가 없습니다.


또한 다음을 참조 할 수 있습니다.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs.85).aspx

즉, "HeapEnableTerminationOnCorruption"과 같이 WinApi 메모리 할당자가 관리하는 HEAP의 일부 기능을 활성화 할 수 있습니다.

내가 이해하는 바와 같이 보안 측면에서 애플리케이션에 대한 부가 가치로 간주 될 수있는 몇 가지 기본적인 힙 오버플로 보호 기능을 제공합니다.

(예 : 임의의 코드를 실행하는 것보다 내 앱 (앱 소유자로서) 충돌을 선호 함)

다른 것은 개발 초기 단계에서 유용 할 수 있으므로 프로덕션으로 이동하기 전에 메모리 문제를 파악할 수 있다는 것입니다.


이것은 MS가 그것에 대해 말하는 것입니다 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx

지금까지 언급 한 한 가지는 "malloc 함수는 런타임 종속이라는 단점이 있습니다. 새 연산자는 컴파일러 종속적이고 언어 종속적 인 단점이 있습니다."

또한 "메모리를 할당 할 수없는 경우 예외를 발생 시키도록 HeapAlloc에 ​​지시 할 수 있습니다."

따라서 프로그램을 CRT로 실행하거나 CRT없이 실행하려면 HeapAlloc을 사용합니다. 아마도 그런 일을 할 사람은 멀웨어 작성자 일 것입니다. 또 다른 용도는 CRT를 사용하는 대신 고유 한 힙 할당자를 작성하려는 특정 메모리 할당 / 사용 패턴으로 매우 메모리 집약적 인 애플리케이션을 작성하는 경우입니다.


malloc 은 컴파일러 고유의 CRT (Run-Time Library)에 의해 내 보내진 함수입니다.
C 런타임 라이브러리 dll 이름이 Visual Studio 버전에서 버전으로 변경됩니다.

HeapAlloc 함수는 Windows 폴더에있는 kernel32.dll에 의해 내보내집니다.

참조 URL : https://stackoverflow.com/questions/8224347/malloc-vs-heapalloc

반응형