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上下文环境中使用。   

  • 相关阅读:
    【BZOJ 1370】 团伙
    【BZOJ 1590】 Secret Message
    【BZOJ 2288】 生日礼物
    【POJ 3630】 Phone List
    【BZOJ 1398】 Necklace
    platform驱动之probe函数
    linux输入子系统之按键驱动
    linux输入子系统概念介绍
    操盘策略:KDJ三线合一 必定孕育大牛股
    nandflash裸机程序分析
  • 原文地址:https://www.cnblogs.com/darrenji/p/3976029.html
Copyright © 2011-2022 走看看