首页 > 编程语言 >【C#随笔】封装一下NativeMemory类

【C#随笔】封装一下NativeMemory类

时间:2024-12-31 14:30:49浏览次数:1  
标签:Span C# ptr NativeMemory byteCount INativeMemoryOwner 封装 public

终于,主播也是用上博客园了,可喜可贺

来博客园不能不发文章,所以主播没事干先发个一篇看看实力

.NET6的时候引入了一个新类,叫NativeMemory,里面提供了Alloc Free等方法作为malloc和free的包装

想当年我写非托管内存的时候都是Marshal类起手,居然写了这么久才发现早就有了这玩意,那不得封装一下

首先,NativeMemory的方法直接与指针交互,都不是nint类型,必须得开允许不安全代码

接下来我打算模仿一下.NET自带的IMemoryOwner接口写一个INativeMemoryOwner接口

public interface INativeMemoryOwner : IDisposable
{
    Span<byte> Span { get; }
}

很好,有了接口,我们现在还得需要一个静态类和实现类,主播不会起名字,随便起两个名字吧

public static class NativeMemoryGetter
{
    private unsafe class DefaultNativeMemoryOwner : INativeMemoryOwner
    {
        private int byteCount;
        private void* ptr;
        public DefaultNativeMemoryOwner(nuint byteCount)
        {
            this.byteCount = (int)byteCount;
            ptr = NativeMemory.Alloc(byteCount);
        }

        public Span<byte> Span => new Span<byte>(ptr, byteCount);

        public void Dispose() => NativeMemory.Free(ptr);
    }

    public static INativeMemoryOwner GetSpan(nuint byteCount) => new DefaultNativeMemoryOwner(byteCount);
}

OK,非常完美,现在使用NativeMemoryGetter.GetSpan就可以方便的获取堆内存了

标签:Span,C#,ptr,NativeMemory,byteCount,INativeMemoryOwner,封装,public
From: https://www.cnblogs.com/mliybs/p/18642830

相关文章

  • SpringBoot集成ECDH密钥交换
    简介对称加解密算法都需要一把秘钥,但是很多情况下,互联网环境不适合传输这把对称密码,有密钥泄露的风险,为了解决这个问题ECDH密钥交换应运而生EC:EllipticCurve——椭圆曲线,生成密钥的方法DH:Diffie-HellmanKeyExchange——交换密钥的方法设计数据传输的两方服务端(Server)和客......
  • SCL_倒计时功能
    1、可以设置计时时间,单位是分钟,数据类型INT;2、显示倒计时时间:分和秒都要显示;3、带启停按钮,启动之后才开始计时,停止后计时暂停;4、用尽量少的变量实现此功能;可以实现倒计时,不能中途更改时间:REGIONsecond//StatementsectionREGION#Local_PositiveEdge:="Clock_1Hz"AND......
  • equals方法和hashcode方法为什么说要一起重写?
    两种方法的作用hashcode用于快速定位位置,equals用于确保将要存储的对象与原对象是否相同实现规则对于一个使用hashcode方式存储的集合或者列表来说,同一个对象只能存在一个位置,不能出现在不同位置出现相同对象的情况,对象的equals比较结果和hashcode值应该保持一种统一的关......
  • 基于Cascade算法的尺度函数与小波函数求解实例演示-附Matlab源程序
    ......
  • Elasticsearch构建全文搜索系统
    Elasticsearch构建全文搜索系统|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|---------......
  • ElasticSearch7基础分页以及Scroll分页
    ElasticSearch7基础分页以及Scroll分页|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|--......
  • Elasticsearch:如何在搜索时得到精确的总 hits 数
    Elasticsearch:如何在搜索时得到精确的总hits数|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|--------......
  • Elasticsearch Unable to parse response body HTTP-1
    ElasticsearchUnabletoparseresponsebodyHTTP-1.1413RequestEntityTooLarge问题解决|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermissio......
  • elasticSearch Alternatively use a keyword field instead
    elasticSearchAlternativelyuseakeywordfieldinstead.|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|--------......
  • 7、RabbitMQ队列之远程调用(RPC)【RabbitMQ官方教程】
    在第二个教程中,我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务。但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?好吧,那是另一回事。这种模式通常被称为远程过程调用或RPC。在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务......