ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#如果span(memory)引用堆栈上的缓冲区会发生什么

2019-11-08 11:04:43  阅读:371  来源: 互联网

标签:net-standard memory stack-overflow c


.NET Standard 2.1引入了一项新功能,您可以在其中“控制”内存块而不用复制它们:SpanMemory.

在docs示例中,我注意到可以引用堆栈缓冲区:

byte data = 0;
Span<byte> stackSpan = stackalloc byte[100];
for (int ctr = 0; ctr < stackSpan.Length; ctr++)
   stackSpan[ctr] = data++;

据我所知,一个进程的堆栈内存是有限的(1MB或4MB),我们无法手动释放它.

因此,我想创建一个Memory< T>或Span T会以某种方式“固定”堆栈上的内存位置,以便我们对其进行索引吗?但这不是堆栈泄漏的潜在情况,它可能导致堆栈溢出吗?
由于堆栈上的阵列应与Memory T一样长.或Span T.

解决方法:

这是安全的,因为Span的生存期将等于或短于堆栈分配的数组.

您不能将stackalloc的结果分配给Memory< T>.至少直接(我认为即使不安全的代码也不能帮助-C#: convert generic pointer to array),因此将其范围限定为Span< T>.

根据您发布的link,跨度寿命与其定义的范围有关:

Span<T> is a ref struct that is allocated on the stack rather than on the managed heap. Ref struct types have a number of restrictions to ensure that they cannot be promoted to the managed heap,

注意,ref struct禁止某些操作,包括您应注意的操作-返回Span< T>.来自分配堆栈的方法.结果,将同时(或更早)销毁跨度,然后销毁包含stackalloc创建的数组的堆栈帧.

   static Span<byte> MySpan()
   {
        Span<byte> span = stackalloc byte[100];
        // error CS8352: Cannot use local 'span' in this context because it may 
        // expose referenced variables outside of their declaration scope
        return span;
    }

Stephen Toub的《 MSDN杂志》文章(2018年1月)C# – All About Span: Exploring a New .NET Mainstay也对此进行了介绍.

标签:net-standard,memory,stack-overflow,c
来源: https://codeday.me/bug/20191108/2007574.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有