c#中未初始化的struct与未初始化的类的大小是多少?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中未初始化的struct与未初始化的类的大小是多少?相关的知识,希望对你有一定的参考价值。

虽然可能很明显,但我还是找不到答案。

我的问题是双重的。

想象一下,我有一个成员变量,直到需要时才初始化。我知道如果这个成员变量属于类类型,则成员变量的大小在初始化时将是int的大小,因为它只引用一个对象实例。

问题1是:这里未初始化的成员变量的大小是多少?我认为它很可能是相同的(int的大小)并且是某种空引用但我想问,因为我没有找到它肯定。

问题2是:如果它是结构类型,该成员变量的大小是多少?如果未初始化,大小是多少?我的猜测是尺寸是sizeof('struct_type'),无论如何,但我希望得到确认。

谢谢!

我想知道一个例子是否有助于我澄清

public struct StructChild
{
    public int One;
    public int Two;
    public int Three;
    public int Four;
    public int Five;
}

public class StructParent
{
    public StructChild Child;
}

public class ClassChild
{
    public int One;
    public int Two;
    public int Three;
    public int Four;
    public int Five;
}

public class ClassParent
{
    public ClassChild Child;
}

在这个例子中,StructParent的大小是ClassParent的大约5倍?

答案

我知道如果这个成员变量属于类类型,则成员变量的大小在初始化时将是int的大小,因为它只引用一个对象实例。

不,你不知道,因为它是假的。

参考是32位进程中的32位和64位进程中的64位。这就是我们称之为64位进程的原因。

引用只是32位进程中32位int的大小。

这里未初始化的成员变量的大小是多少?

首先,没有未初始化的成员变量。内存分配器将所有成员变量初始化为其默认值。有未分配的成员变量,但C#中没有未初始化的成员变量。未分配的成员变量具有初始化的值:它是默认值。

其次,变量的大小在分配时不会改变。引用类型的成员变量占用的存储量与一个引用一样多,无论它们是否已分配。

如果它是结构类型,该成员变量的大小是多少?

这是实现定义。它取决于详细信息,例如结构成员的打包方式,以及是否存在任何布局属性。

我的猜测是大小是sizeof('struct_type')

用户定义类型T的sizeof(T)仅适用于不安全的代码,并且仅当结构是所有“非托管”类型时,如整数,指针类型等。

但是当它确实有效时,你可以依靠它来告诉你内存中有多大的东西。

请注意,编组器的SizeOf告诉您在编组边界上复制它时有多大,而不是在内存中有多大。

在这个例子中,StructParent的大小是ClassParent的大约5倍?

不。您忘记了作为引用类型实例的所有对象(包括盒装值类型)都有一个对象头。对象标头是两个引用的大小。

在32位机器上,我们期望StructParent的一个实例占用其字段20个字节,其头部占用8个字节,总共28个.ClassParent的实例占用头部8个字节,4个字节用于成员变量共12个,不是28的五分之一。

以上是关于c#中未初始化的struct与未初始化的类的大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

将 memset 与未初始化的变量一起使用

具有非静态成员初始化器的类的 C++11 聚合初始化

在构造函数代码之前禁用默认类成员初始化

在 C 中初始化指针数组 - 可变大小的对象可能未初始化

在c中初始化结构数组

C ++中未初始化的内存分配