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++的内存管理,拉到最后),这里就不复述了,这里面写得挺详细的

posted @ 2021-01-21 19:45  陌冉  阅读(959)  评论(1编辑  收藏  举报