.NET,获取用于保存结构实例的内存
本文关键字:实例 内存 结构 保存 获取 用于 NET | 更新日期: 2023-09-27 17:59:24
可以确定内存使用情况(根据Jon Skeet的博客)像这样:
public class Program
{
private static void Main()
{
var before = GC.GetTotalMemory(true);
var point = new Point(1, 0);
var after = GC.GetTotalMemory(true);
Console.WriteLine("Memory used: {0} bytes", after - before);
}
#region Nested type: Point
private class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
#endregion
}
它打印Memory used: 16 bytes
(我正在运行x64机器)。考虑将Point声明从类更改为结构。那么如何确定使用的内存?有可能吗?我找不到任何关于获取堆栈大小的信息。净
P。S
是的,当更改为"struct"时,Point实例将通常存储在Stack上(并不总是),而不是Heap上。很抱歉没有第一次将其与问题一起发布。
P。P.S
这种情况根本没有实际用途(IMHO),只是我很感兴趣的是是否可以获得Stack(短期存储)大小。我找不到任何关于它的信息,所以问你,所以专家)。
如果按照您的方式创建结构,您将不会在GetTotalMemory中看到任何更改,因为它将成为线程堆栈的一部分,而不是单独分配。GetTotalMemory
调用仍然有效,并向您显示进程的总分配大小,但结构不会导致分配新内存。
您可以使用sizeof(Type)或Marshal。SizeOf返回结构的大小(在本例中为8字节)。
有一个特殊的CPU寄存器ESP,它包含指向堆栈顶部的指针。也许你可以找到一种方法来读取这个寄存器。Net(使用一些不安全或外部代码)。然后,只需将这个指针在给定时刻的值和线程开始时的值进行比较,它们之间的差异将或多或少是用于线程堆栈的内存量。不确定它是否真的有效,只是一个想法:)
孤立地说,正如您在这里所做的那样,使用这种方法可能会取得"合理"的成功。我不相信这些信息是有用的,但运行这种方法论,特别是如果您多次运行它以确保没有任何其他代码或GC操作影响结果。然而,在现实世界的应用中使用这种方法不太可能给出准确的结果,因为变量太多了。
但要意识到,这只是"合理的",而不是保证。
为什么你需要知道物体的大小?只是好奇,因为知道商业原因可能会有其他选择。