我试图使用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字节的额外大小?
您不需要使用不安全的代码。建议使用 System.Runtime.InteropServices.Marshal.SizeOf()
\n\n例如:Marshal.SizeOf(new EmployeeStruct());
\n\n返回 16 而不是 12,因为内存中的默认包大小是 8。
\n\n因此对于:
\n\nstruct EmployeeStruct\n{\n int empId; // 4 bytes\n long salary; 8 bytes\n}\nRun 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 }\nRun 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 }\nRun 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 }\nRun 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 } \nRun Code Online (Sandbox Code Playgroud)\n\nSizeOf(typeof(EmployeeStruct) 将返回 24 而不是 32,但请记住,内存上的实际大小是 32,编译器使用 32 字节来分配内存。
\n\n问候。
\n| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |