728x90
반응형
728x170
▶ HeapMemory.cs
using System;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 힙 메모리
/// </summary>
/// <typeparam name="TElement">요소 타입</typeparam>
public unsafe ref struct HeapMemory<TElement> where TElement : unmanaged
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 버퍼 크기
/// </summary>
private int bufferSize;
/// <summary>
/// 버퍼 핸들
/// </summary>
private IntPtr bufferHandle;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - HeapMemory(bufferSize)
/// <summary>
/// 생성자
/// </summary>
/// <param name="bufferSize">버퍼 크기</param>
public HeapMemory(int bufferSize)
{
this.bufferSize = bufferSize;
long totalSize = this.bufferSize * sizeof(TElement);
IntPtr totalSizeHandle = new IntPtr(totalSize);
this.bufferHandle = Marshal.AllocHGlobal(totalSizeHandle);
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 범위 구하기 - GetSpan()
/// <summary>
/// 범위 구하기
/// </summary>
/// <returns>범위</returns>
public Span<TElement> GetSpan()
{
return new Span<TElement>(this.bufferHandle.ToPointer(), this.bufferSize);
}
#endregion
#region 리소스 해제하기 - Dispose()
/// <summary>
/// 리소스 해제하기
/// </summary>
/// <remarks>C# 8.0 이상 버전을 사용해야 한다.</remarks>
public void Dispose()
{
if(this.bufferHandle == IntPtr.Zero)
{
return;
}
Marshal.FreeHGlobal(this.bufferHandle);
this.bufferHandle = IntPtr.Zero;
}
#endregion
}
}
▶ Program.cs
using System;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
int bufferSize = 1024;
Action<int> action = (count) =>
{
while(count-- > 0)
{
// C# 8.0 이상 버전을 사용해야 한다.
using(HeapMemory<int> heapMemory = new HeapMemory<int>(bufferSize))
{
Span<int> span = heapMemory.GetSpan();
span[0 ] = 0;
span[bufferSize - 1] = 0;
}
}
};
action(100);
}
#endregion
}
}
※ C# 8.0 버전 사용을 위해 TestProject.csproj 파일에 아래와 같이 코드를 추가한다.
<PropertyGroup>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 누겟 패키지 조건부 참조 사용하기 (0) | 2022.01.16 |
---|---|
[C#/COMMON] 조건부 참조 사용하기 (0) | 2022.01.16 |
[C#/COMMON] 멀티 타겟팅 클래스 라이브러리 만들기 (0) | 2022.01.16 |
[C#/COMMON] 빌드시 누겟 패키지 만들기 (0) | 2022.01.16 |
[C#/COMMON] EnumFontFamiliesEx API 함수를 사용해 문자 세트에 대한 폰트명 리스트 구하기 (0) | 2022.01.16 |
[C#/COMMON] Marshal 클래스 : AllocHGlobal 정적 메소드를 사용해 네이티브 힙 사용하기 (0) | 2022.01.09 |
[C#/COMMON] 누겟 설치 : System.Memory (0) | 2022.01.09 |
[C#/COMMON] 닷넷 프레임워크 버전 구하기 (0) | 2022.01.09 |
[C#/COMMON] GetSystemMetrics API 함수를 사용해 터치 이용 가능 여부 구하기 (0) | 2022.01.08 |
[C#/COMMON] 누겟 설치 : AudioSwitcher.AudioApi.CoreAudio (0) | 2022.01.08 |
[C#/COMMON] 누겟 설치 : AudioSwitcher.AudioApi (0) | 2022.01.08 |
댓글을 달아 주세요