C#中Struct 和Class 的大小
-
-
数据类型 32位 64位 取值范围(32位) char -(没测试) 2 byte 1 1 0~255 sbyte 1 1 –32,768~32,767 ushort 2 2 0~65,535 int 4 4 -2,147,483,648~2,147,483,647 uint 4 4 0~4,294,967,295 ulong 4 8 0~4,294,967,295 float 4 4 3.4E +/- 38 (7 digits) double 8 8 1.7E +/- 308 (15 digits) -
求struct 和class 的大小
public struct MyStructNull { } public struct MyStruct { private int a; } public class MyClassNull { } public class MyClassint { private int a; } public class MyClassLong { private long a; } public class MyClassByte { private byte a1; private byte a2; private byte a3; } static class Program { private static void CaculateMemory<T>(Func<T> action) { GC.Collect(0); long start = GC.GetTotalMemory(true); var a = action(); GC.Collect(0); long end = GC.GetTotalMemory(true); Console.WriteLine(end - start); } static void Main() { Console.WriteLine(Marshal.SizeOf(new MyStructNull()));//1 Console.WriteLine(Marshal.SizeOf(new MyStruct()));//4 CaculateMemory((() => { return new MyClassNull(); }));//12 CaculateMemory((() => { return new MyClassint(); }));//12 CaculateMemory((() => { return new MyClassLong(); }));//16 CaculateMemory((() => { return new MyClassByte(); }));//12 } }
-
Struct验证结果为1,空的struct是1,理论上是0,编译器实现为1,如果里面有了数据就是数据实际大小,不会多1。
-
Class就有意思了,空类为12,加了个int还是12,这让我十分困惑,但是有了Struct的经验,我又做了2个测试,当内部有个long的时候是16,多了4,也符合long和int的差值,那我加个3byte的话,就应该是11,和int差1(也可以加1个但是为了引出我接下来的测试就用3个byte),我试着打印了个byteclass的大小,结果也为12,再根据操作系统的内存对其的理论,我有个猜想,当然纯粹是笔者自己的设想没有验证过,当class为空类时,实际大小为9,内存对其后变成12,当class有值的时候,class大小为8(至于为什么为8。。。讲道理我也想知道,再开次脑洞吧,class是引用类型,引用说白了内部就是指针,C#底层就是C,C里面指针在64位系统下多大?嗯哼?没错,8!所以是不是破案了。。。当然都是我猜的),内存对其按4字节对齐
-
那我又有一个想法,C++中的Struct属性排列方式会影响struct的内存大小,在C+中是否还存在?
public struct MyStructA { private int a; private long b; private char c; } public struct MyStructB { private int a; private char c; private long b; } static class Program { static void Main() { Console.WriteLine(Marshal.SizeOf(new MyStructA()));//24 Console.WriteLine(Marshal.SizeOf(new MyStructB()));//16 } }
事实证明属性的排布对于Struct的影响还是存在的,具体关于struct内存的详细解析可以看(C++的内存管理,拉到最后),这里就不复述了,这里面写得挺详细的
-
-