gpt4 book ai didi

c# - c# 编译器是否决定自己使用 stackalloc?

转载 作者:太空狗 更新时间:2023-10-30 00:47:17 25 4
gpt4 key购买 nike

我发现了一个博客条目,它暗示有时 c# 编译器可能会决定将数组放在堆栈而不是堆上:

Improving Performance Through Stack Allocation (.NET Memory Management: Part 2)

这个人声称:

The compiler will also sometimes decide to put things on the stack on its own. I did an experiment with TestStruct2 in which I allocated it both an unsafe and normal context. In the unsafe context the array was put on the heap, but in the normal context when I looked into memory the array had actually been allocated on the stack.

有人可以证实吗?
我试图重复他的例子,但每次我尝试时,数组都分配在堆上。

如果 c# 编译器可以在不使用“不安全”关键字的情况下完成这样的技巧,我特别感兴趣。我有一个代码可以处理许多小字节数组(8-10 字节长),因此为每个新字节使用堆 [...] 是浪费时间和内存(尤其是堆上的每个对象都有 8 字节的开销垃圾收集器需要)。

编辑:我只想描述为什么它对我很重要:
我正在编写与 Gemalto.NET 智能卡通信的库,其中可以包含 .net 代码。当我调用一个返回值的方法时,智能卡返回 8 个字节来描述返回值的确切类型。这 8 个字节是使用 md5 哈希和一些字节数组连接计算的。
问题是,当我有一个我不知道的数组时,我必须扫描应用程序中加载的所有程序集中的所有类型,并且我必须为每个程序集计算这 8 个字节,直到找到相同的数组。
我不知道找到类型的其他方法,所以我正在尝试尽可能加快它的速度。

最佳答案

此处链接文章的作者。

在不安全的上下文之外强制进行堆栈分配似乎是不可能的。这很可能是为了防止某些类的堆栈溢出情况。

相反,我建议使用内存回收器类,它会根据需要分配字节数组,但也允许您在之后“将它们转入”以供重用。它就像保留一堆未使用的字节数组一样简单,当列表为空时,分配新的。

Stack<Byte[]> _byteStack = new Stack<Byte[]>();

Byte[] AllocateArray()
{
Byte[] outArray;
if (_byteStack.Count > 0)
outArray = _byteStack.Pop();
else
outArray = new Byte[8];
return outArray;
}

void RecycleArray(Byte[] inArray)
{
_byteStack.Push(inArray);
}

如果您尝试将散列与类型匹配,最好的办法似乎是使用字典进行快速查找。在这种情况下,您可以在启动时加载所有相关类型,如果这导致程序启动变得太慢,您可能需要考虑在第一次使用每种类型时缓存它们。

关于c# - c# 编译器是否决定自己使用 stackalloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com