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#에서는 속도가 쓸데없이 굉장히 느려지는 현상이 발생할 수 있습니다.
그러니까 항상 메모리를 생각하며 코딩합시다