첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.

728x90
반응형
728x170

TestProject.zip
0.00MB

▶ 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
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요