C# 堆栈上是否存储了可为null的类型?

C# 堆栈上是否存储了可为null的类型?,c#,generics,C#,Generics,如果您有可为空的null,它是否存在于堆栈上?它占用多少字节?这两个问题的正确答案应该无关紧要 但是,为了娱乐您,非集合元素、非引用类型字段、非迭代器块中的局部、lambda中的提升局部或堆栈上可能存储了匿名方法的Nullable实例 不过,这也没关系。这是一个实现细节(这意味着它可能是Microsoft实现CLR的一种方式,但不一定是这样,也可能是Mono实现CLR的另一种方式)。这不重要,因为这两个问题都是正确答案 但是,为了娱乐您,非集合元素、非引用类型字段、非迭代器块中的局部、lambd

如果您有可为空的
null
,它是否存在于堆栈上?它占用多少字节?

这两个问题的正确答案应该无关紧要

但是,为了娱乐您,非集合元素、非引用类型字段、非迭代器块中的局部、lambda中的提升局部或堆栈上可能存储了匿名方法的
Nullable
实例


不过,这也没关系。这是一个实现细节(这意味着它可能是Microsoft实现CLR的一种方式,但不一定是这样,也可能是Mono实现CLR的另一种方式)。

这不重要,因为这两个问题都是正确答案

但是,为了娱乐您,非集合元素、非引用类型字段、非迭代器块中的局部、lambda中的提升局部或堆栈上可能存储了匿名方法的
Nullable
实例


不过,这也没关系。这是一个实现细节(这意味着它可能是Microsoft实现CLR的一种方式,但不一定是,也可能是Mono实现CLR的另一种方式)。

当您提到堆栈上的值类型时,Microsoft员工Eric Lippert,但是的,
Nullable
是一种值类型


它们通常存在于堆栈上,只是有一个布尔成员指示值是否为null。因此(不包括填充字节),可为空的
需要5个字节。

Microsoft员工Eric Lippert在提到堆栈上的值类型时,是的,
可为空的
是一种值类型

它们通常存在于堆栈上,只是有一个布尔成员指示值是否为null。因此(不包括填充字节),可为空的
需要5个字节。

可为空的
是一个结构(因此也是一个值类型),因此分配位置的规则适用于任何其他结构

Eric Lippert最近发布了以下内容:

因此:

A
Nullable
是一个结构(因此也是一个值类型),因此分配位置的规则适用于任何其他结构

Eric Lippert最近发布了以下内容:


所以:

那么,这真的占用了8个字节(带填充),我错了吗?可为空的int是否比int32效率低?实际上是的,8字节。在堆栈上这不是一个问题-在堆栈上分配变量不需要时间,而且空间永远不应该是一个问题(如果是的话,您会遇到更大的问题)。数组虽然可以加起来——如果你担心这个问题,你可以创建一个泛型类,它包装了一个T数组,还有一个指示非空值的BitArray类,还有一个返回可空T的索引函数。那么,这真的需要8个字节(带填充),我错了吗?可为空的int是否比int32效率低?实际上是的,8字节。在堆栈上这不是一个问题-在堆栈上分配变量不需要时间,而且空间永远不应该是一个问题(如果是的话,您会遇到更大的问题)。数组虽然可以累加,但如果这是您关心的问题,您可以创建一个泛型类,它包装了一个T数组,以及一个指示非空值的BitArray类,以及一个返回可为null的T的索引函数。您是对的。不太重要,只是想知道到底发生了什么。如果Nullable占用2个内存帧,int占用1个内存帧,那么我会假设1更有效,我错了吗?如果你正在考虑使用Nullable,那么我猜你可能会关心int的null值,因此,如果不使用Nullable,您可能会有其他一些内存被其他指示器占用?@wcpro:如果它对您试图建模的对象具有正确的含义,您应该选择
Nullable
。您是对的。不太重要,只是想知道到底发生了什么。如果Nullable占用2个内存帧,int占用1个内存帧,那么我会假设1更有效,我错了吗?如果你正在考虑使用Nullable,那么我猜你可能会关心int的null值,因此,如果不使用Nullable,您可能会有其他一些内存被其他指示器占用?@wcpro:如果它对您试图建模的对象具有正确的含义,您应该选择
Nullable