gpt4 book ai didi

c# - 我的类(class)使用了多少内存实例 - 务实的答案

转载 作者:行者123 更新时间:2023-11-30 15:29:55 25 4
gpt4 key购买 nike

  1. 调用构造函数后,以下类的实例有多大?我想这通常可以写成 size = nx + c,其中 x = 4在 x86 中,x = 8 在 x64 中。 n = ? c = ?
  2. .NET 中有什么方法可以返回这个数字吗?

class Node
{
byte[][] a;
int[] b;
List<Node> c;
public Node()
{
a = new byte[3][];
b = new int[3];
c = new List<Node>(0);
}
}

最佳答案

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

2) 的答案是否定的,对于作为参数给出的任何对象,没有函数可以为您提供所请求的答案。

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

  • 尝试进行一些测试以找出答案
  • 分析物体并做数学运算

测试方法

先看看这些:

你需要的方法是这样的:

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 位程序中生成的,还要注意这个数字可能会随着框架实现和版本而改变。这只是一个例子,如果对象足够简单,你可以在某个时刻很好地猜测对象的大小。 Array 和 List 开销常量取自 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,所以我认为该方法是正确的。

关于c# - 我的类(class)使用了多少内存实例 - 务实的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22986431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com