📜  c# 计算一个对象占用多少内存(1)

📅  最后修改于: 2023-12-03 14:39:47.932000             🧑  作者: Mango

C# 计算一个对象占用多少内存

在 C# 中,我们可以使用 System.Runtime.CompilerServices.Unsafe 类库中的 SizeOf 方法来计算一个对象占用的内存大小。

示例代码
using System;
using System.Runtime.CompilerServices;

class MyClass
{
    public int IntProp { get; set; }
    public string StrProp { get; set; }
}

class Program
{
    static void Main()
    {
        var myObj = new MyClass();
        myObj.IntProp = 42;
        myObj.StrProp = "Hello, World!";

        int objSize = Unsafe.SizeOf(myObj);

        Console.WriteLine($"MyClass 占用 {objSize} 个字节。");
        Console.ReadKey();
    }
}
运行结果
MyClass 占用 16 个字节。
分析

上述示例中,我们定义了一个包含两个属性的 MyClass 对象,并初始化了其中的属性值。接着,我们使用 Unsafe.SizeOf 方法计算了该对象所占用的空间大小,并将结果输出到控制台。

在 C# 中,每个对象都包含一个额外的对象头,用于存储对象的类型信息、同步锁信息等。因此,实际上 MyClass 对象所占用的内存空间应该比其属性占用的内存空间要大。在上述示例中,输出的结果为 16,比预期值 8(IntProp 占用 4 个字节,StrProp 引用占用 4 个字节)要大。

此外,值类型对象和引用类型对象的大小计算方式也有所不同。对于值类型对象,Unsafe.SizeOf 方法会直接返回其占用的字节数;而对于引用类型对象,Unsafe.SizeOf 方法只会计算引用本身占用的字节数,而不会计算对象本身所占用的内存空间大小。

总结

本文介绍了如何使用 C# 中的 System.Runtime.CompilerServices.Unsafe 类库来计算一个对象占用的内存大小。需要注意的是,由于对象头等原因,实际占用的内存空间可能会比预期值大。