如果将数组用作 struct (C#) 中的元素,它存储在哪里?

Posted

技术标签:

【中文标题】如果将数组用作 struct (C#) 中的元素,它存储在哪里?【英文标题】:If an array is used as an element in struct (C#) , where is it stored? 【发布时间】:2012-03-10 16:57:33 【问题描述】:

我们尽可能在 C# 中使用 struct 主要是因为它存储在堆栈中并且没有为它创建对象。这提高了性能。

另一方面,数组存储在堆上。

我的问题是,如果我包含一个数组作为结构的元素,如下所示:

struct MotionVector

    int[] a;
    int b;

那会有什么后果。该数组会存储在堆栈中吗?还是会失去使用 struct 的性能优势?

【问题讨论】:

***.com/questions/3942721/c-structs-versus-classes 您有实际的性能问题吗?见blogs.msdn.com/b/ericlippert/archive/2009/04/27/… ***.com/a/1114152/55209 — 一个很好的解释 @ken2k 我确实有性能问题。我正在制作一个实时手势识别系统。任何关于改进逻辑的方法都将受到高度赞赏! 【参考方案1】:

只有指向数组的指针才会存储在堆栈中。实际的数组将存储在堆中。

【讨论】:

【参考方案2】:

int[] a 是一个引用类型,即它引用一个整数数组。 “引用”本身将存储在堆栈中。但是,当您执行以下操作时,它引用的数据将存储在堆中:

MotionVector z;
z.a = new int[10];

【讨论】:

【参考方案3】:

你将在你的结构中持有对 a 的引用;这将是堆栈结构的一部分。

实际的 int[] 对象,如果/当您初始化它时,将去往其他地方(大多数架构中的堆)。

【讨论】:

【参考方案4】:

如果您不想动态创建元素,请考虑在启动期间创建 MotionVector 实例的(大)缓冲区,并在需要时重用它们。那么您将不会受到动态创建/破坏它们的惩罚。

当然,您必须编写一些小函数来获取“免费”实例并获得一个,为此在结构中使用布尔值(或使用接口)。

为此,您可以例如:

在您的应用初始化期间创建运动矢量:

MotionVectors motionVectors;

向 MotionVector 类添加一个布尔值:

public class MotionVector

    bool InUse  get; set; 

    public MotionVector() 
    
        InUse = false; 
    

定义新类 MotionVectors:

class MotionVectors

    MotionVector _instances[100];

    public void Free(MotionVector vector)
    
        var index = 'search vector in _instances' 
        _instances[index].Inuse = false;
    

    public MotionVector GetNewInstance()
    
        var index = 'first free vector in _instances'
        _instances[index].Inuse = true;
        return _instances[index];
    

【讨论】:

这似乎是个好主意。太感谢了。你能举几个例子来说明如何做到这一点吗? 恐怕我没有真实的例子,但我会稍微调整一下我的答案。

以上是关于如果将数组用作 struct (C#) 中的元素,它存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

C ++:是否可以将引用用作映射中的值?

C#如何将变量用作键值字符串数组的对象列表对象构造函数中的属性名称

不同应用程序(WPF 和 Unity)中的 C# struct 序列化返回不同大小的字节数组

C# Struct 到字节数组的编组方式与 Delphi 中的打包记录相同

如何将interface 转成struct数组

C-为啥Struct数组的冒泡排序会跳过Array中的第一个元素?