zoukankan      html  css  js  c++  java
  • C#中sizeof的用法

    在C#中,sizeof用来计算类型的大小,单位是字节。有这样的一个类:

        public class MyUglyClass
    
        {
    
            public char myChar1;
    
            public int myInt;
    
            public char myChar2;
    
        }

    在客户端,试图使用sizeof计算该类型的大小。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                MyUglyClass m = new MyUglyClass();
    
                m.myChar1 = 'd';
    
                m.myInt = 25;
    
                m.myChar2 = 'a';
    
                Console.WriteLine(sizeof(MyUglyClass));
    
            }
    
        }
    

    运行,报错:
    12

    ○ 第一个报错说明要使用sizeof,必须使用关键字unsafe
    ○ 第二个报错说明sizeof对运行时变量无效,只能针对编译器变量统计其大小

     

    把类改成struct值类型。

        public struct MyUglyClass
    
        {
    
            public char myChar1;
    
            public int myInt;
    
            public char myChar2;
    
        }

     

    客户端改成如下:

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                MyUglyClass m = new MyUglyClass();
    
                m.myChar1 = 'd';
    
                m.myInt = 25;
    
                m.myChar2 = 'a';
    
                unsafe
    
                {
    
                    Console.WriteLine(sizeof(MyUglyClass));
    
                }
    
                
    
            }
    
        }

    运行,继续报错:"不安全代码只会在使用 /unsafe 编译的情况下出现"。
    解决方法是:右键项目→属性→生成→勾选"允许不安全代码"→保存

    再次运行,结果:12

     

    问题又来了,在MyUglyClass这个值类型结构中,char类型16位,相当于2个字节,int类型32位,相当于4个字节。MyUglyClass类型大小=2+2+4=8个字节,应该是8个字节才对!怎么会是12个字节呢?

     

    这就涉及到栈的对齐和填充了。就拿上面的例子来说:原本,栈上有int类型的变量占4个字节,2个char类型的变量分别占2个字节,当栈上的这些变量排列之后,栈还要进行对齐排列,即所有较小字节的变量向最大字节的变量看齐,并且填充空位。

    13

    红叉部分是为了对齐而填充补上的。

     

    如果想忽略为了对齐而填充补上的部分,可以使用[StructLayout]特性。

        [StructLayout(LayoutKind.Auto)]
    
        public struct MyUglyClass
    
        {
    
            public char myChar1;
    
            public int myInt;
    
            public char myChar2;
    
        }

    再次运行,结果:8

     

    总结:sizeof只适用于值类型,并且需要在unsafe上下文环境中使用。   

  • 相关阅读:
    Openstack API 开发 快速入门
    virtualBox虚拟机到vmware虚拟机转换
    使用Blogilo 发布博客到cnblogs
    Openstack Troubleshooting
    hdoj 1051 Wooden Sticks(上升子序列个数问题)
    sdut 2430 pillars (dp)
    hdoj 1058 Humble Numbers(dp)
    uva 10815 Andy's First Dictionary(快排、字符串)
    sdut 2317 Homogeneous squares
    hdoj 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列+二分)
  • 原文地址:https://www.cnblogs.com/darrenji/p/3976029.html
Copyright © 2011-2022 走看看