在C#中,struct需要多少内存?

时间:2016-05-26 22:44:41

标签: c# memory struct

我将使用大约320,000,000个数据点来处理高分辨率波形。每个数据点将需要2个浮点数(XY坐标),总共8个字节。

为了一次性分配这个内存,我计划使用struct,如下所示:

public struct Point
{
    public float X; //4-bytes
    public float Y; //4-bytes.
}

由于struct是一个值类型,我假设它只消耗每个变量所需的内存量,以及CLR使用的一些小的固定量(公共语言运行时) )。

有没有办法计算结构在应用程序运行期间将使用多少内存?也就是说,我知道以下内容:

  • 结构中有多少个变量。
  • 每个变量使用了多少字节。
  • 在给定时间点将有多少个结构实例存活。

1 个答案:

答案 0 :(得分:5)

  

由于struct是一个值类型,我假设它只消耗每个变量所需的内存量,以及CLR使用的一些小的固定量(公共语言运行时)。

不。值类型没有任何继承开销。这是无法支持继承的权衡。

所以你只需支付它所包含的字段的大小。

例外:

如果你将结构放在Object 类型的变量中,它就会产生对象开销:

  

我在博客文章“内存与字符串”中谈到这一点。它是特定于实现的,但对于Microsoft .NET CLR v4,x86 CLR的每个对象开销为8个字节,而x64 CLR的每个对象开销为16个字节。

What is the memory overhead of a .NET Object

如果将其强制转换为接口类型,也会发生同样的事情。

如果你在数组中坚持结构,那么数组本身就有一些对象开销加上一个整数来存储数组的长度。但无论数组长度如何,这都是固定成本。

如果在List<struct> 中粘贴结构,则会有两个对象:列表和列表使用的数组。因此每个对象成本的两倍,加上从列表到数组的指针,加上一个整数来了解当前使用的阵列数量。

如果您在ListList<object> 中添加结构,则会产生上述开销,加上列表中每个项目的一个指针的成本,加上每个 - 列表中每个项目的对象开销。