sizeof运算符在C#中给出了结构的额外大小

Pra*_*thi 5 c# struct sizeof

我试图使用sizeof运算符检查所有变量(值类型)的大小.我通过一个走了MSDN文章,里面写到那

对于所有其他类型(包括结构),sizeof运算符只能用于不安全的代码块

并且结构不应包含任何引用类型的字段或属性

为此,我在项目属性中启用了不安全的编译,并创建了如下结构 -

struct EmployeeStruct
{
    int empId;
    long salary;       
}
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用 -

unsafe
{
   size = sizeof(EmployeeStruct);
}

Console.WriteLine("Size of type in bytes is: {0}", size);
Run Code Online (Sandbox Code Playgroud)

在这里我得到输出,因为字体大小是16:但是通过查看结构它应该是12(4表示int,8表示长).有人可以帮我理解为什么我得到4字节的额外大小?

Gon*_*alo 1

您不需要使用不安全的代码。建议使用 System.Runtime.InteropServices.Marshal.SizeOf()

\n\n

例如:Marshal.SizeOf(new EmployeeStruct());

\n\n

返回 16 而不是 12,因为内存中的默认包大小是 8。

\n\n

因此对于:

\n\n
struct EmployeeStruct\n{\n    int empId; // 4 bytes\n    long salary;  8 bytes\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

//返回16而不是12(因为最小单位是8)

\n\n

为了:

\n\n
 struct EmployeeStruct\n {\n    int empId; // 4 bytes\n    int empAge; // 4 bytes\n    long salary;  8 bytes\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

//也返回16

\n\n

并为

\n\n
   struct EmployeeStruct\n   {\n      int empId; // 4 bytes\n      int empAge; // 4 bytes\n      int IdCompany; // 4 bytes\n      long salary;  8 bytes\n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回 24 而不是 20(因为最小单位是 8)

\n\n

我不知道你想要什么,但如果你需要每个字段大小的总和,你可以尝试使用这个函数:

\n\n
    public int SizeOf(Type t)\n    {\n        int s = 0;\n        var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);\n        foreach (var f in fields)\n        {\n            var x = f.FieldType;\n            s += x.IsPrimitive ? Marshal.SizeOf(x) : SizeOf(x);\n        }\n\n        return s;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于您的情况,它返回 12 而不是 16,您可以将它用于复杂的结构,例如:

\n\n
    struct EmployeeStruct\n    {\n        int field1; // 4 bytes\n        long field2; // 8 bytes\n        Person p; // 12 bytes\n    }\n\n    struct Person\n    {\n        int field1; // 4 bytes\n        long field2; // 8 bytes\n    }  \n
Run Code Online (Sandbox Code Playgroud)\n\n

SizeOf(typeof(EmployeeStruct) 将返回 24 而不是 32,但请记住,内存上的实际大小是 32,编译器使用 32 字节来分配内存。

\n\n

问候。

\n