gpt4 book ai didi

c# - Stackalloc 和值类型

转载 作者:行者123 更新时间:2023-11-30 14:56:15 33 4
gpt4 key购买 nike

我从一篇较早的 StackOverflow 帖子中读到了一个关于何时使用 stackalloc 的示例。现在这个例子让我有点困惑:

public unsafe void DoSomeStuff()
{
byte* unmanaged = stackalloc byte[100];
byte[] managed = new byte[100];

//Do stuff with the arrays

//When this method exits, the unmanaged array gets immediately destroyed.
//The managed array no longer has any handles to it, so it will get
//cleaned up the next time the garbage collector runs.
//In the mean-time, it is still consuming memory and adding to the list of crap
//the garbage collector needs to keep track of. If you're doing XNA dev on the
//Xbox 360, this can be especially bad.
}

如果我错了,请随时纠正我,因为我在 C# 和一般编程方面仍然是一个新手。但是字节不是值类型吗?值类型不是存储在它们被声明的地方吗?这是否意味着在此示例中,managed 也存储在堆栈中,并且通过扩展,当此堆栈帧完成并转到调用地址时,内存会自动清理,因此 managed 应该以与本示例中的 unmanaged 相同的方式删除吗?

最佳答案

类型byte[] 看起来类似于stackalloc byte[100],但它代表的东西完全不同。 byte[] 包含对堆对象实例的引用,其类型派生自 System.Array,而 stackalloc byte [100](就此而言,fixed byte[100];)包含 100 个字节。期望类型为 byte[] 的代码将只接受堆对象引用;它不会直接接受 100 个字节。与所有引用类型一样,存在任何类型引用的 System.Array 实例保证存在的时间与引用本身存在的时间一样长(如果发现对象只能通过弱引用访问,这些引用将在对象不复存在之前失效,以维护此不变量)。如果在当前堆栈帧之外的任何地方都没有存储对数组的引用,则在堆栈帧退出后它将不复存在,但如果引用存储在其他地方,则只要任何引用存在,数组就会继续存在。

关于c# - Stackalloc 和值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229096/

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