• C#结构内存布局介绍


    转载:http://www.csharpwin.com/csharpspace/10455r2800.shtml

    本来打算写一篇文章,详细地讨论一下结构的内存布局,但是想了下,跟路西菲尔的这篇文章也差不多,所以这里只做一下补充:

    一、对齐长度

    如果没有显式的指定对齐长度,将以结构中占用空间最大的成员的长度作为对齐长度;如果要显式指定对齐长度,需设置StructLayoutAttribute.Pack,如:

    [StructLayout(LayoutKind.Sequential,Pack=4)]
        struct MyStruct
        {
    
        }

    对齐长度的作用在于:如果某个字段的长度大于或等于对齐长度,则对齐长度没用;如果小于对齐长度,则以对齐长度为单元,占用的空间是对齐长度的整数倍,同时保证不大于对齐长度的字段一定分配在同一单元,并且其首地址一定是字段长度的整数倍。

    如:

    struct MyStruct
        {
            byte a;
            char b;
            int c;
        }
    

    第0个字节为a,第1个字节无数据,第2,3个字节为b,第4,5,6,7为c。

    二、“诡异”的decimal类型

    有这样一个结构,请问其占用空间是多少?

    struct MyStruct
    {
        int a;
        decimal b;
        double c;
    }
    

    最初我以为是48个字节,因为int是4个字节,decimal是16个字节,double是8个字节,decimal最大,所以以16个字节对齐,所以是48个字节。

    但实际上是32个字节。

    这其中的原因在于,decimal是由4个int构成的:

    struct Decimal
    {
        private int flags;
        private int hi;
        private int lo;
        private int mid;
    .....//其他不占据对象内存的成员
    }
    

    所以上述结构中占内存最大的成员是double,对齐长度是8

    三、.Net中实现C语言的Union

    可以通过下面的自定义字段位置的方法,在.Net中实现C风格的Union

    [StructLayout(LayoutKind.Explicit)]
        struct MyStruct
        {
            [FieldOffset(0)]
            int a;
            [FieldOffset(2)]
            short b;
            [FieldOffset(3)]
            byte c;
        }
    

    从0开始计数,第2个字节为a,b共用,第3个字节为a,b,c共用。

  • 相关阅读:
    使用STM32驱动双通道12位DAC(TLV5618)
    CentOS 7挂载离线yum源
    有关于Git的使用的一点心得和说明
    STM32单片机学习心得——MDK使用技巧
    小米手机连接ADB
    我看操作系统的发展
    centos7下cups + samba共打印服务
    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤
    centos7 更新yum源
    CentOS7 安装Odoo9.0
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3410226.html
Copyright © 2020-2023  润新知