.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(短期存储)大小。我找不到任何关于它的信息,所以问你,所以专家)。

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

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

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

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

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

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

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