Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时使用ArraySegment<;T>;过度记忆<;T>;?_C# - Fatal编程技术网

C# 何时使用ArraySegment<;T>;过度记忆<;T>;?

C# 何时使用ArraySegment<;T>;过度记忆<;T>;?,c#,C#,我正在研究将“视图”返回到一个非常大的数组中的最佳方法,并找到了非常适合我的需要的ArraySegment。然而,我随后发现内存,除了需要一个span来查看内存外,它的行为似乎是相同的 对于创建视图并将其写入大规模(2GB+)阵列的用例,使用哪个阵列重要吗 大数组的原因是它们保存图像的字节。内存有点像是Span的包装器,不必在堆栈上。正如CoolBots提供的链接所指出的,它是阵列和阵列段的补充,而不是真正的替代品 P>你想考虑使用Sp/内存的主要原因是性能和灵活性。Span允许您直接访问内存

我正在研究将“
视图
”返回到一个非常大的数组中的最佳方法,并找到了非常适合我的需要的
ArraySegment
。然而,我随后发现
内存
,除了需要一个span来查看内存外,它的行为似乎是相同的

对于创建视图并将其写入大规模(2GB+)阵列的用例,使用哪个阵列重要吗


大数组的原因是它们保存图像的字节。

内存有点像是Span的包装器,不必在堆栈上。正如CoolBots提供的链接所指出的,它是阵列和阵列段的补充,而不是真正的替代品

<> P>你想考虑使用Sp/内存的主要原因是性能和灵活性。Span允许您直接访问内存,而不是将内存来回复制到阵列中,并且允许您以灵活的方式处理内存。下面,我将从使用数组作为字节转到使用它作为uint数组

我将直接跳到Span,但您可以使用AsMemory,这样您可以更轻松地传递。但它仍然可以归结为从记忆中获得跨度

下面是一个例子:

        const int dataSize = 512;
        const int segSize = 256;

        byte[] rawdata = new byte[dataSize];

        var segment = new ArraySegment<byte>(rawdata, segSize, segSize);

        var seg1 = segment.AsSpan();

        var seg1Uint = MemoryMarshal.Cast<byte, uint>(seg1);

        for (int i = 0; i < segSize / sizeof(uint); ++i)
        {
            ref var data = ref seg1Uint[i];

            data = 0x000066;
        }

        foreach (var b in rawdata)
            Console.WriteLine(b);
const int dataSize=512;
常数int segSize=256;
byte[]rawdata=新字节[dataSize];
var段=新数组段(rawdata、segSize、segSize);
var seg1=section.AsSpan();
var seg1Uint=MemoryMarshal.Cast(seg1);
对于(int i=0;i
首先,您确定让这些阵列完全占用内存是明智的吗?
MemoryMappedFile
是一个更好的起点吗?在不了解您的用例的情况下,任何人都很难提供具体的建议。ArraySegment只是一个方便的工具,可以避免每次访问元素时都必须添加段的偏移量。在引擎盖下,它仍然这样做,这增加了一些成本,每一个电话。内存对象与C#数组一样高效。用例是将图像拼接在一起。生成的图像需要编码为.png,因此需要将整个文件存储在内存中。这是否回答了您的问题
ArraySegment
较旧,因此它存在。我会在所有新代码中使用
内存
(或
Span
,视需要而定)。我要补充的是,标准API似乎倾向于使用
内存
Span
,而不是数组。例如