C#sizeof用法

本文详细介绍了C#中sizeof方法的使用,解释了如何通过该方法获取值类型的字节大小,并探讨了不同环境下struct和enum类型大小的计算原理。此外还讨论了内存对齐的重要性及其对类型大小的影响。

C#中sizeof方法

用于获取 值类型 的字节大小。https://msdn.microsoft.com/zh-cn/library/eahchzkf(VS.80).aspx

对于所有其他类型(包括 struct),sizeof 运算符只能在不安全代码块中使用。虽然可以使用 SizeOf 方法,但该方法返回的值和 sizeof 返回的值并不总是相同的。Marshal.SizeOf 在已封送处理类型后返回大小,而 sizeof 返回公共语言运行库分配的大小(包括任何空白)。

计算struct大小

    public struct StructTest
    {
        public char a;
        public int b;
        public char c;
        public double d;      
        public char e;
    }

输出

32位:32

64位:32

这个很奇怪!!!不太懂

内存对齐。计算机系统对基本类型在内存中存放的位置进行限制,要求这些数据的首地址是某个数的倍数(4或8),这个数叫做对齐模数。ANSI C标准并没有规定,相邻的变量在内存中一定要相邻,内存对齐问题有编译器自行灵活处理。32位系统最大对齐模数是4,因为一次最大读取32位。

对齐原因:

(1)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

(2)性能原因:数据结构应尽可能的在自然边界上对齐。为了访问未对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要异常访问。

对齐规则:

1)结构体或union联合的数据成员,第一个数据成员是要放在offset==0的地方,如果遇上子成员,要根据子成员的类型存放在对应的整数倍的地址上。

2)如果结构体作为成员,则要找到这个结构体中的最大元素,然后从这个最大成员的整数倍地址开始存储。

如果想忽略为了对齐而填充补上的部分,可以使用[StructLayout]特性,可以选择Auto、Explicit、Sequential三种对齐方式

    [StructLayout(LayoutKind.Auto)] 
    public struct StructTest
    {
        public char a;
        public int b;
        public char c;
        public double d;      
        public char e;
    }

输出

32位:20=a(2)+b(4)+c(2)+d(4+4)+e(2)+2,补齐,对齐模数=4

64位:24=a(2)+b(4)+c(2)+d(8)+e(2)+6,补齐,对齐模数=8

计算枚举类型enum大小

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(sizeof(MyEnum1));
            Console.WriteLine(sizeof(MyEnum2));
            Console.WriteLine(sizeof(MyEnum3));
            Console.ReadKey();
        }
        enum MyEnum1
        {
        }
        enum MyEnum2
        {
            C1 = 1,
        }
        enum MyEnum3
        {
            C1 = 1,
            C2 = 2
        }
    }

返回值均为4,枚举是为了更好的定义常量,优点是常量值是自动生成的,这些常量可以用int范围数表示,所以sizeof(enumType)=sizeof(int)=4。

Marshal.SizeOf()方法

https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.sizeof(v=vs.110).aspx

返回类的非托管大小(以字节为单位)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值