C# 中是不是可以使用基于堆栈的数组?
Posted
技术标签:
【中文标题】C# 中是不是可以使用基于堆栈的数组?【英文标题】:Are stack based arrays possible in C#?C# 中是否可以使用基于堆栈的数组? 【发布时间】:2011-01-28 04:52:50 【问题描述】:假设,假设(阅读:我不认为我真的需要这个,但我很好奇这个想法突然出现在我的脑海中),一个人想要在堆栈上本地留出一个内存数组,而不是在堆上.例如,这样的事情:
private void someFunction()
int[20] stackArray; //C style; I know the size and it's set in stone
我猜答案是否定的。我所能找到的只是基于堆的数组。如果有人需要这个,会有任何解决方法吗?有没有办法以“值类型”的方式留出一定数量的顺序内存?还是具有命名参数的结构是唯一的方法(就像 XNA 中的 Matrix struct 有 16 个命名参数 (M11-M44))?
【问题讨论】:
【参考方案1】:你想要的是stackalloc
;不幸的是,你只能在不安全的代码中使用它,这意味着它不会在有限的权限上下文中运行。
您还可以为每种元素类型创建一个包含必要数量的变量的结构,但您需要为每个想要使用的“数组”大小创建一个新类型
【讨论】:
嗯,原始的 LinkedList 怎么样?在你的结构集上一个/下一个相同类型的结构上......你没有得到 ICollection 语义,但对于 IEnumerable 来说可能就足够了...... 感谢您的回复。是的,基于结构的 LinkedLists 可能吗?你知道为什么 .NET 中没有基于安全堆栈的数组选项吗? @Frank:你不能这样做 - 当我尝试编译递归结构时,我得到一个'CS0523:结构成员Nullable<T>
仍然是一个结构,所以它不会工作。想想看 - 当你声明一个递归结构时,你基本上是在要求 CLR 为无限的结构列表分配空间。【参考方案2】:
我能想到的最接近基于堆栈的数组的东西是手动嵌套结构;对于大小为 N^M 的数组,代码大小为 O(MN),访问时间为 O(M);可以方便地缩放 M 和 N(例如,可以将 4096 元素数组处理为六层嵌套 4 元素结构、四层嵌套 8 元素结构或三层嵌套 16 元素结构、两层嵌套64 元素结构等)如果想要对 16 元素数组进行三层深度嵌套(可能是最实用的折衷方案),可以定义一个包含 f0 到 f15 字段的 16 元素结构,以及使用以下方法的访问方法switch/case 来选择一个元素。然后可以定义一个 16 元素的结构,一个 16 元素的结构,等等。
一般来说,使用标准数组比使用值类型结构来模拟数组要好,但有时将数组类的东西作为值类型会是有利的。值类型数组的优势在 .net 中往往会受到限制,但是,在处理通过引用操作值类型时存在一些限制。虽然如果可以通过编写“MyArrayishThing[1][2][3]”简单地从上述数组中访问元素 0x123 会很好,但这对于读取和写入来说效率低下(因为子表达式 MyArrayishThing[1 ] 将制作包含 256 个数组元素的结构的副本)。相反,有必要通过引用可以访问其中元素 2 的例程传递 MyArrayishThing[1] 并通过引用访问其中元素 3 的例程传递它。可以有效地做到这一点,但代码最终看起来相当讨厌。
【讨论】:
以上是关于C# 中是不是可以使用基于堆栈的数组?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?