首页> 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