.NET Framework: 866. C# - 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용 (sysnet.pe.kr)
public unsafe ref struct NativeMemory<T> where T : unmanaged
{
int _size;
IntPtr _ptr;
public NativeMemory(int size)
{
_size = size;
long lSize = _size;
lSize *= sizeof(T);
IntPtr bufSize = new IntPtr(lSize);
_ptr = Marshal.AllocHGlobal(bufSize);
}
public Span<T> GetView()
{
return new Span<T>(_ptr.ToPointer(), _size);
}
// C# 8.0에서만 using과 함께 사용 가능
public void Dispose()
{
if (_ptr == IntPtr.Zero)
{
return;
}
Marshal.FreeHGlobal(_ptr);
_ptr = IntPtr.Zero;
}
}
static unsafe void Main(string[] args)
{
int bufSize = 1024;
Action<int> a2 = (count) =>
{
// 무한 루프를 돌며,
while (count-- > 0)
{
/ Native Heap, 즉 비-관리 힙으로부터 배열 메모리 할당
using (NativeMemory<int> buf = new NativeMemory<int>(bufSize))
{
Span<int> viewBuf = buf.GetView();
viewBuf[0] = 0;
viewBuf[bufSize - 1] = 0;
}
}
};
}
'C#' 카테고리의 다른 글
[C#] UDP Socket을 이용한 통신 (2) | 2020.12.04 |
---|---|
[C#] TCP Socket을 이용한 통신 (0) | 2020.12.04 |
[C#] BCL DataContractJsonSerializer을 이용한 객체 JSON 직렬화 (0) | 2020.11.30 |
[C#] BCL MemoryStream, StreamWriter/Reader, BinaryWriter/Reader (0) | 2020.11.29 |
[C#] BCL Regex 정규식을 이용한 이메일 규칙 판별 (0) | 2020.11.29 |