카테고리 없음

c++ 메모리 할당 성능

denny 2025. 4. 8. 11:52

C++의 최신 환경(C++17, C++20, 그리고 이제 C++23)에서도 new와 delete는 여전히 상대적으로 무거운 연산으로 간주됩니다. 하지만 몇 가지 측면에서 개선되거나 대체할 수 있는 방법이 생겼어요. 아래에 정리해볼게요.


✅ new / delete가 느린 이유

  1. 힙(Heap) 메모리 접근
    • new는 힙에서 메모리를 할당하므로, 스택보다 느릴 수밖에 없습니다.
  2. 할당자(allocator) 동기화 문제
    • 다중 스레드 환경에서는 동기화 비용이 발생할 수 있어요.
  3. 메모리 단편화
    • 반복적인 할당/해제가 단편화를 유발하여 성능 저하로 이어질 수 있습니다.

✅ 최신 C++에서는 어떻게 개선할 수 있나?

1. 스마트 포인터 사용

  • std::unique_ptr, std::shared_ptr 등을 사용하면 delete를 명시적으로 호출하지 않아도 돼요.
  • 하지만 내부적으로는 new / delete를 사용하기 때문에 성능 차이는 크지 않음, 다만 안전성은 매우 증가.

2. 커스텀 메모리 풀 (memory pool) 사용

  • 반복적으로 할당/해제되는 객체가 많다면, 풀 할당을 통해 new / delete 비용을 거의 제거 가능.
  • 대표 라이브러리: Boost.Pool, Google's TCMalloc, jemalloc, mimalloc 등.

3. std::pmr (Polymorphic Memory Resource) - C++17 이후

  • C++17부터 std::pmr::memory_resource를 통해 커스텀 할당자 사용 가능.
  • 복잡한 객체 생성에서 할당 전략을 더 유연하고 빠르게 구성할 수 있어요.

4. Arena Allocator, Stack Allocator 등 사용

  • 게임 엔진이나 실시간 시스템에서는 stack-like allocator를 많이 사용합니다.
  • 일반적인 new보다 훨씬 빠릅니다.

✅ 결론

  • 최신 환경에서도 new/delete는 비용이 여전히 존재합니다.
  • 하지만 스마트 포인터, 메모리 리소스(pmr), 메모리 풀, 커스텀 할당자 등을 활용하면 훨씬 더 효율적인 메모리 관리가 가능합니다.
  • 단순 new/delete 남용은 지양하고, 반복되는 할당/해제가 있다면 풀 할당자나 pmr 등의 최신 기능을 사용하는 것이 좋습니다.