C# .NET,获取用于保存结构实例的内存

C# .NET,获取用于保存结构实例的内存,c#,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(&

可以确定内存使用情况(根据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
}
它打印所用内存:16字节(我正在运行x64机器)。 考虑将点声明从类更改为结构。那么如何确定使用的内存?有可能吗?我在.NET中找不到有关获取堆栈大小的任何信息

P.S 是的,当更改为“struct”时,点实例通常会存储在堆栈(不总是)上,而不是存储在堆上。很抱歉,没有第一次将其与问题一起发布

P.P.S
这种情况根本没有实际用途(IMHO),我只是想知道是否有可能获得堆栈(短期存储)大小。我找不到任何关于它的信息,所以问了你,所以专家们。)

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


您可以使用或返回结构的大小(在本例中为8字节)。

单独使用,正如您在这里所做的那样,使用此方法可能会取得“合理”的成功。我不相信这些信息是有用的,但是运行这种方法,特别是如果您多次运行它以确保没有任何其他代码或GC操作影响结果的话。然而,在实际应用中使用这种方法不太可能给出准确的结果,因为变量太多

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


为什么需要知道对象的大小?只是好奇,因为知道业务原因可能会导致其他选择。

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

当您尝试它时会发生什么?使用相同的代码并将其更改为struct会有什么问题?AFAIK结构的工作方式与此相同,只是它们被视为值类型,并且只应用于小于16字节的对象。实际上,您回答了您的问题:)结构通常(并非总是值类型存储在堆栈中,请参阅Eric Lippert的博客)存储在堆栈中,上面的代码从heapSorry读取可用内存,因为不清楚,我认为很明显,问题是-是否有可能在某个时刻确定堆栈上分配的内存:)?@taras.roshko:您可以使用“dumpbin/HEADERS theProgram.exe”查看为默认线程的程序设置的堆栈大小。寻找类似“100000大小的堆栈保留”。默认情况下,这将是用于新线程的堆栈大小。这可以通过以下方式在运行时为新线程更改:这只是为了好玩:)。但我认为,在一些内存/性能测试中,比较值/引用类型(再次)可能很有用