gpt4 book ai didi

c# - 可空类型存储在内存中的什么位置?

转载 作者:行者123 更新时间:2023-11-30 18:43:49 25 4
gpt4 key购买 nike

这可能是关于 nullable types 的后续问题.

可空值类型(int? ...)究竟存储在内存中的什么位置?首先我认为它足够清楚,因为Nullable<T>是结构,那些是值类型。然后我找到了 Jon Skeet 的文章“Memory in .NET”,其中说:

Note that a value type variable can never have a value of null - it wouldn't make any sense, as null is a reference type concept, meaning "the value of this reference type variable isn't a reference to any object at all".

看完这篇文章后,我有点困惑。所以假设我有 int? a = null; .作为int通常是值类型,它是否以某种方式存储在 struct Nullable<T> 中?在堆栈中(我使用“正常”,因为我不知道值类型变为可为空时会发生什么)?或者这里发生任何其他事情 - 也许在堆中?

最佳答案

首先,Nullable<int>只是以下内容的简写:

struct Nullable<T> 
{
bool hasValue;
T value;
}

加上所有的构造器、访问器等等。仅此而已——可为空的 int 是一个普通的 int 加上一个表明 int 是否为 null 的标志。剩下的就是将“null”视为有效值的编译器魔术;所有“null”对可空类型所做的就是使您成为标志设置为 false 的结构之一。

现在我们已经解决了这个问题,您的问题是“它们在内存中的位置”?它们与任何其他结构在内存中的位置相同:运行时和编译器认为这是给定内存生命周期的最佳位置。

大多数结构都在堆上。任何告诉您“结构总是在堆栈中”的人实际上并不知道他们在说什么;我们的文档没有这么说,也不是真的。当结构是局部变量或临时变量时,结构只进入临时内存池,也就是“堆栈”,并且局部变量不是匿名方法或 lambda 的封闭外部变量,并且局部变量不在迭代器中堵塞。在我们的实现中,所有其他结构都在堆上。

另请注意,不要求 CLI 的实现使用“堆栈”来创建临时池。例如,经典的 JScript 内存管理器将其临时池存储在堆上。 (尽管 JScript 运行时引擎当然不是 CLI 的实现;我只是指出可以设计一个托管运行时引擎,它不会将任何用户数据放在“堆栈”上。)逻辑上它是一个堆栈数据结构,但该数据结构并未存储在“the”堆栈中,它只是分配在堆上的堆栈结构。

我不得不问:你为什么关心? CLR 代表您管理内存。你为什么关心可空类型放在哪里?他们去他们活得够久对你有用的地方;您不必为此担心。

关于c# - 可空类型存储在内存中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811516/

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