.NET,获取用于保存struct实例的内存

时间:2011-06-16 18:12:25

标签: c#

可以确定内存使用情况(根据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中获取堆栈大小的信息

P.S

是的,当更改为'struct'时,Point实例将经常存储在Stack(并非总是),而不是Heap.Sorry,因为它不会第一次将其与问题一起发布。

P.P.S

这种情况根本没有实际用途(恕我直言),我觉得是否有可能获得Stack(短期存储)大小。我无法找到任何关于它的信息,所以问过你,SO专家)。

3 个答案:

答案 0 :(得分:4)

如果以您的方式创建结构,您将看不到GetTotalMemory的更改,因为它将成为线程堆栈的一部分,而不是单独分配。 GetTotalMemory调用仍然有效,并显示进程的总分配大小,但结构不会导致分配新的内存。

您可以使用sizeof(Type)Marshal.SizeOf返回结构的大小(在本例中为8个字节)。

答案 1 :(得分:1)

有一个特殊的CPU寄存器ESP,它包含指向堆栈顶部的指针。您可以找到一种从.Net读取此寄存器的方法(使用一些不安全或外部代码)。然后只是将给定时刻的指针值与线程启动时的值进行比较 - 它们之间的差异将是或多或少的精确内存量,用于线程的堆栈。不确定它是否真的有效,只是一个想法:)

答案 2 :(得分:0)

孤立地,正如您在此处所做的那样,您可以通过此方法获得“合理”的成功。我不相信这些信息是有用的,但运行这种方法,特别是如果你运行它多次,以确保你没有任何其他代码或GC行动影响结果。然而,在现实世界的应用程序中使用此方法不太可能提供准确的结果,因为变量太多。

但要意识到,这只是“合理”而不是保证。

为什么你需要知道物体的大小?只是好奇,因为了解商业原因可能会导致其他选择。