C#中Struct 和Class 的大小 agile Posted on Jun 18 2023 c# > 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.cnblogs.com](https://www.cnblogs.com/moran-amos/p/14310050.html) * 对象的基本内存大小 * 基本类型的内存占用 <table><thead><tr><th>数据类型</th><th>32 位</th><th>64 位</th><th>取值范围(32 位)</th></tr></thead><tbody><tr><td>char</td><td>-(没测试)</td><td>2</td><td></td></tr><tr><td>byte</td><td>1</td><td>1</td><td>0~255</td></tr><tr><td>sbyte</td><td>1</td><td>1</td><td>–32,768~32,767</td></tr><tr><td>ushort</td><td>2</td><td>2</td><td>0~65,535</td></tr><tr><td>int</td><td>4</td><td>4</td><td>-2,147,483,648~2,147,483,647</td></tr><tr><td>uint</td><td>4</td><td>4</td><td>0~4,294,967,295</td></tr><tr><td>ulong</td><td>4</td><td>8</td><td>0~4,294,967,295</td></tr><tr><td>float</td><td>4</td><td>4</td><td>3.4E +/- 38 (7 digits)</td></tr><tr><td>double</td><td>8</td><td>8</td><td>1.7E +/- 308 (15 digits)</td></tr></tbody></table> * 求 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++ 的内存管理,拉到最后),这里就不复述了,这里面写得挺详细的 __EOF__ C#的内存分配探索 语言