我发现一个博客条目表明有时 c# 编译器可能决定将数组放在堆栈而不是堆上:
这个人声称:
编译器有时也会决定自己把东西放在堆栈上。我用 TestStruct2 做了一个实验,我给它分配了一个不安全和正常的上下文。在不安全的上下文中,数组被放在堆上,但在正常的上下文中,当我查看内存时,数组实际上是在堆栈上分配的。
有人可以确认吗?
我试图重复他的例子,但每次我尝试数组都分配在堆上。
如果 c# 编译器可以在不使用 'unsafe' 关键字的情况下做到这一点,我对它特别感兴趣。我有一个代码正在处理许多小字节数组(8-10 个字节长),因此为每个新字节使用堆 [...] 是浪费时间和内存(尤其是堆上的每个对象都有 8 个字节的开销垃圾收集器需要)。
编辑:我只想描述为什么它对我很重要:
我正在编写与 Gemalto.NET 智能卡通信的库,它可以在其中运行 .net 代码。当我调用一个返回某些东西的方法时,智能卡返回 8 个字节来描述我返回值的确切类型。这 8 个字节是通过使用 md5 哈希和一些字节数组连接计算得出的。
问题是,当我有一个我不知道的数组时,我必须扫描应用程序中加载的所有程序集中的所有类型,并且对于每个类型,我必须计算这 8 个字节,直到找到相同的数组。
我不知道找到类型的其他方法,所以我试图尽可能加快速度。