· 2 min read
C# Unmanaged Memory C# Unmanaged Memory
C#에서 GC를 거치지 않는 비관리 메모리 할당과 해제 방법. Marshal, stackalloc, Span<T> 활용법과 주의사항. Memory managed by the CLR (Common Language Runtime), subject to Garbage Collection.
Managed Memory
CLR(Common Language Runtime)이 관리하는 메모리. Garbage Collection의 대상이 된다.
Unmanaged Memory
Managed Memory가 아닌 것.
C# 에서도 C++ 에서처럼 직접 메모리를 할당 할 수 있다.
IntPtr memory = Marshal.AllocHGlobal(100);
for (int i = 0; i < 100; ++i)
{
((byte*) memory)[i] = (byte)(i + 1);
}
Marshal.FreeHGlobal(memory);stackalloc 표현식
Stack 에 메모리가 할당됨. 그 Stack을 벗어날 때 자동으로 메모리 해제.
일시적인 계산을 위한 메모리를 사용할 때, stackalloc을 사용함으로써 Managed Heap에 할당되지 않게 하여 최적화 가능.
public void RemoveAll() // Dash.Core.Systems.GeneratorSystem
{
Span<int> serials = stackalloc int[_generators.Count];
int index = 0;
foreach (int serial in _generators.Keys)
{
serials[index++] = serial;
}
foreach (int serial in serials)
{
_generators.Remove(serial);
}
}
사견
C#을 막연하게 C, C++ 보다 느리다고 생각하는 사람들이 많다.
심지어 C#을 메인 스킬로 다루는 사람들까지도.
어떤 부분에서 퍼포먼스가 떨어지는 것인지, 그걸 해결하기 위한 방법이 있는지에 대해
자세히 알아야 할 필요가 있다고 생각한다.
N년간 C# / .Net에 관심을 가저오며 지금은 **C#으로도 *High Performance Program*을 만들 수 있다, 하지만 쉽지 않을 것이다** 라는 결론에 도달했다.
그렇게 생각하게 된 이유를 공유하고 싶고,
.Net 및 Managed Langauge에 대한 편견을 없애보고 싶다.

