C++ Memory and Optimization

C++과 C# 반복문에서 배열 반복 사용

doyyy_0 2024. 10. 21. 09:56

C++과 C#의 반복문에서 배열이나 벡터를 반복적으로 사용할 때의 예시입니다.

다음은 C++과 C#의 코드 입니다.

 

1. C++

#include <vector>

int main() {
    std::vector<int> v(10000);
    for (int i = 0; i < 10000; i++) {
        v = std::vector<int>(10000);
    }
}

 

2. C#

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        List<int> v = new List<int>(new int[10000]);
        for (int i = 0; i < 10000; i++) {
            v = new List<int>(new int[10000]);
        }
    }
}

 

코드 설명

1) C++의 std::vector<int>와 C#의 List<int>:

  • C++의 std::vector는 동적 배열로, 크기가 자동으로 조정되는 배열입니다.
  • C#의 List<int>는 std::vector와 매우 유사한 역할을 합니다. List는 크기가 가변적인 배열을 제공하며, 메모리 관리도 자동으로 수행됩니다.

2) 메모리 할당:

  • C++에서 v = std::vector<int>(10000);는 새로 크기 10,000의 벡터를 생성하고, 기존 벡터는 소멸자가 호출되어 자동으로 메모리가 해제됩니다.
  • C#에서 v = new List<int>(new int[10000]);는 새로운 List<int> 객체를 생성하고, 기존 리스트는 참조가 끊어지므로 가비지 컬렉터에 의해 나중에 메모리가 해제됩니다.

여기서 주의할점은 메모리 할당과 해제 방식입니다. C++의 vector는 내부적으로 메모리와 해당 메모리를 가리키는 포인터가 자동으로 해제되지만, C#은 가비지 컬렉터에 의해 메모리가 자동으로 관리됩니다. 

 

10000개의 int값이면 40000비트인데 C++은 괜찮지만 C#은 언제 해제될지몰라 순식간에 많은 메모리를 사용하여 추후에 메모리 단편화가 발생할 수 있습니다. 만약에 10000이 아니라 1000000이라면 C#에서는 속도가 쓸데없이 굉장히 느려지는 현상이 발생할 수 있습니다.

 

그러니까 항상 메모리를 생각하며 코딩합시다