系统相关
首页 > 系统相关> > 首页> C#>我的班级使用多少内存实例-务实的答案

首页> C#>我的班级使用多少内存实例-务实的答案

作者:互联网

>构造函数调用后,下一个类的实例有多大?
我想这通常可以写成size = nx c,其中x = 4
在x86中,在x64中x = 8. n =? c =?
> .NET中是否有一些方法可以返回此数字?

类节点
{
    byte [] [] a;
    int [] b;
    列表<节点> C;
    公共Node()
    {
        a =新字节[3] [];
        b =新的int [3];
        c =新的List<节点>(0);
    }
}

解决方法:

首先,这取决于该程序的编译和运行环境,但是,如果您修复了一些变量,则可以得到很好的猜测.

2)的答案为“否”,没有任何函数可以为作为参数的任何对象提供您要求的答案.

在解决1)中,您有两种方法:

>尝试执行一些测试以找出答案
>分析对象并进行数学运算

测试方法

首先看看这些:

> what-is-the-memory-overhead-of-a-net-object
> Overhead of a .NET array?
> C# List size vs double[] size

您需要的方法是这样的:

const int Size = 100000;
private static void InstanceOverheadTest()
{
    object[] array = new object[Size];
    long initialMemory = GC.GetTotalMemory(true);
    for (int i = 0; i < Size; i++)
    {
        array[i] = new Node();
    }
    long finalMemory = GC.GetTotalMemory(true);
    GC.KeepAlive(array);
    long total = finalMemory - initialMemory;
    Console.WriteLine("Measured size of each element: {0:0.000} bytes",
                      ((double)total) / Size);
}

在我的Windows 7计算机上,VS 2012,.NET 4.5,x86(32位)结果是96.000.当更改为x64时,结果为176.000.

做数学方法

做数学方法可以写成一个可以给您结果的函数,但是它特定于您的Node类,并且仅在对对象执行其他操作之前有效.还要注意,这是在32位程序中进行的,并且还请注意,此数字可以随框架实现和版本而改变.这只是一个示例,如果对象足够简单,如何在某个时刻可以对对象的大小给出很好的猜测.数组和列表开销常量取自Overhead of a .NET array?C# List size vs double[] size

public const int PointerSize32 = 4;
public const int ValueArrayOverhead32 = 12;
public const int RefArrayOverhead32 = 16;
public const int ListOverhead32 = 32;
private static int instanceOverheadAssume32()
{
    int sa = RefArrayOverhead32 + 3 * PointerSize32;
    int sb = ValueArrayOverhead32 + 3 * sizeof(int);
    int sc = ListOverhead32;
    return 3 * PointerSize32 + sa + sb + sc;
}

这也将返回96,因此我认为该方法是正确的.

标签:micro-optimization,memory-management,c,net
来源: https://codeday.me/bug/20191029/1961744.html