可以确定内存使用情况(根据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声明从类更改为struct。那么如何确定使用的内存?有可能吗?我无法找到任何有关在.NET中获取堆栈大小的信息
是的,当更改为'struct'时,Point实例将经常存储在Stack(并非总是),而不是Heap.Sorry,因为它不会第一次将其与问题一起发布。
这种情况根本没有实际用途(恕我直言),我觉得是否有可能获得Stack(短期存储)大小。我无法找到任何关于它的信息,所以问过你,SO专家)。
答案 0 :(得分:4)
如果以您的方式创建结构,您将看不到GetTotalMemory的更改,因为它将成为线程堆栈的一部分,而不是单独分配。 GetTotalMemory
调用仍然有效,并显示进程的总分配大小,但结构不会导致分配新的内存。
您可以使用sizeof(Type)或Marshal.SizeOf返回结构的大小(在本例中为8个字节)。
答案 1 :(得分:1)
有一个特殊的CPU寄存器ESP,它包含指向堆栈顶部的指针。您可以找到一种从.Net读取此寄存器的方法(使用一些不安全或外部代码)。然后只是将给定时刻的指针值与线程启动时的值进行比较 - 它们之间的差异将是或多或少的精确内存量,用于线程的堆栈。不确定它是否真的有效,只是一个想法:)
答案 2 :(得分:0)
孤立地,正如您在此处所做的那样,您可以通过此方法获得“合理”的成功。我不相信这些信息是有用的,但运行这种方法,特别是如果你运行它多次,以确保你没有任何其他代码或GC行动影响结果。然而,在现实世界的应用程序中使用此方法不太可能提供准确的结果,因为变量太多。
但要意识到,这只是“合理”而不是保证。
为什么你需要知道物体的大小?只是好奇,因为了解商业原因可能会导致其他选择。