기술(Tech, IT)/C++

[C++] C++ vs. Python (Low-Level Memory Management)

Daniel803 2024. 7. 12. 00:39

C와 C++는 메모리 관리에 더 많은 제어 기능을 제공해 잠재적인 차이점을 제공하는 반면, Python은 이러한 세부 사항을 추상화해 일부 효율성을 희생하는 대신 개발을 간소화한다.

 

  • C, C++ Low-Level Memory Management
    • Manual Memory Allocation (수동 메모리 할당)
      • C
        : C에서는 malloc, calloc, realloc, free와 같은 함수를 사용해 메모리를 직접 관리한다.
        • malloc(size_t size)
          : 초기화 되지 않은 메모리의 크기(바이트)를 할당한다.
        • calloc(size_t num, size_t size)
          : num 요소 배열의 각 크기 바이트에 대한 메모리를 할당하고 모든 바이트를 0으로 초기화한다.
        • realloc(void *ptr, size_t size)
          : ptr이 가리키는 메모리 블록의 크기를 size 바이트로 변경한다.
        • free(void *ptr)
          : 이전에 malloc, calloc 또는 realloc으로 할당된 메모리를 회수한다.
      • C++
        : C++에서는 메모리 할당 및 해제를 위해 new 및 delete 연산자를 사용한다.
        • new
          : 메모리를 할당하고 객체 초기화를 위해 생성자(constructor)를 호출한다.
        • delete
          : 메모리 할당을 해제하고 객체 정리를 위해 소멸자(destructor)를 호출한다.
    • Control Over Memory Layout (메모리 레이아웃 제어)
      : 메모리를 할당하는 방법과 위치를 직접 제어할 수 있다. 이를 통해 memory pooling, custom allocators(사용자 지정 할당자), precise control over object lifetimes(객체 수명 정밀 제어)와 같은 최적화를 수행할 수 있다.

    • Performance Optimization
      : 메모리 할당 및 할당을 제어할 수 있으므로 조각화 최소화, 메모리 재사용, 캐시 성능 향상을 위한 데이터 정렬 등 특정 사용 사례에 맞게 최적화할 수 있다. 특히 리소스가 제한된 시스템이나 게임 또는 실시간 시스템과 같이 성능이 중요한 애플리케이션에서 상당항 성능 향상을 가져올 수 있다.

    • No Garbage Collection
      : C와 C++ 에는 자동 가비지 컬렉션이 없다. 즉, 가비지 컬렉션 일시 중지와 관련된 런타임 오버헤드가 없으며, 이는 가비지 컬렉션을 사용하는 언어에서 중요할 수 있다.
  • Python: Abstracted Memory Management (추상화된 메모리 관리)
    • Automatic Memory Management (자동 메모리 관리)
      : Python은 reference counting (참조 계수) 및 가비지 컬렉션 시스템을 통해 메모리 관리를 자동으로 처리한다.
      • Referencing Counting
        : 각 객체는 자신을 가리키는 참조 수를 추적한다. 참조 수가 0으로 떨어지면 메모리가 자동으로 할당 해제된다.
      • Garbage Collection
        : 파이썬에는 참조 계수만으로는 처리할 수 없는 순환 참조를 감지하고 정리하기 위한 가비지 컬렉션도 포함되어 있다.
    • Ease of Use (사용의 용이성)
      : 메모리 관리가 추상화되면 개발자가 수동으로 메모리를 할당하고 할당 해제할 필요가 없으므로 개발이 간소화된다. 따라서 메모리 누수, 관련된 포인터 및 기타 메머리 관련 버그의 위험이 줄어든다.

    • Overhaed and Performance Impact (오버헤드 및 성능 영향)
      : 이러한 사용 편의성의 대가는 메모리를 자동으로 관리할 때 발생하는 오버헤드다. 가비지 컬렉터는 일시 중지를 유발할 수 있으며, 참조 계수는 모든 객체 작업에 약간의 오버헤드를 추가한다. 또한 자동 시스템이 특정 애플리케이션 요구 사항에 맞게 최적화되지 않을 수 있으므로 수동 메모리 관리에 비해 메모리 사용 효율이 떨어질 수 있다.

    • High-Level Data Structures (고수준 자료 구조)
      : Python은 내부적으로 자체 메모리를 관리하는 고수준 자료 구조(list, dictionary, set 등)를 제공한다. 편리하지만 이러한 추상화는 때때로 C 또는 C++에서 수작업으로 최적화한 구조체에 비해 메모리 사용 효율이 떨어질 수 있다.

아래는 구현 예시다.

  • C
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int *arr;
        arr = (int*)malloc(10 * sizeof(int));
        if (arr == NULL) {
            fprintf(stderr, "Memory allocation failed\n");
            return 1;
        }
    
        for (int i = 0; i < 10; i++) {
            arr[i] = i * 2;
        }
    
        for (int i = 0; i < 10; i++) {
            printf("%d ", arr[i]);
        }
    
        free(arr);
        return 0;
    }
  • Python
    arr = [i * 2 for i in range(10)]
    for value in arr:
        print(value, end=' ')


 

'기술(Tech, IT) > C++' 카테고리의 다른 글

[C++] map VS. unordered_map  (2) 2024.10.17
[C++] C++ vs. Python (Performance)  (0) 2024.07.11
[C++] Windows Application Subsystem  (0) 2024.03.24
[C++] OutputDebugString() 함수  (0) 2024.03.22
[C++] DialogBox() 함수  (0) 2024.03.22