· 2 min read

C# Unmanaged Memory

C#에서 GC를 거치지 않는 비관리 메모리 할당과 해제 방법. Marshal, stackalloc, Span<T> 활용법과 주의사항.

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에 대한 편견을 없애보고 싶다.

Related Posts

View All Posts »

.NET 서버 메모리 누수 잡기 — dotnet-gcdump로 안 보이는 할당 폭탄

.NET 서버 메모리가 2분 만에 136MB에서 14GB로 폭증했다. dotnet-gcdump와 dotnet-counters로도 안 잡히는 할당 폭탄을 추적하고, 그 과정을 재사용 가능한 스킬로 만든 이야기.

#Aethelgard #AI #Claude #GameDev
Unity로 VR 악기 앱 만들기 — 루프 스테이션 1인 밴드 (Solo Band Studio)

Unity로 VR 악기 앱 만들기 — 루프 스테이션 1인 밴드 (Solo Band Studio)

Meta Quest용 VR 음악 창작 툴을 Unity로 개발한 과정. 피아노·드럼·베이스를 연주하고 루프 스테이션으로 혼자 합주를 완성한다. AI와 함께 한 달 만에 만든 대학 수업 프로젝트.

#Unity #VR #Audio #CSharp
실시간 멀티플레이 게임 아키텍처 회고 — 루니아 원정대 5년 후

실시간 멀티플레이 게임 아키텍처 회고 — 루니아 원정대 5년 후

모바일 실시간 멀티플레이 게임 루니아 원정대의 서버 5종 + 클라이언트 2종 전체 아키텍처를 설계했던 경험. 커스텀 ECS, 커맨드 동기화, 분산 서버, 재접속 시스템까지 — 5년이 지난 지금 그때의 기술 판단들을 돌아본다.

#Architecture #Retrospective #CSharp #Multiplay