我将使用大约320,000,000个数据点来处理高分辨率波形。每个数据点将需要2个浮点数(XY坐标),总共8个字节。
为了一次性分配这个内存,我计划使用struct
,如下所示:
public struct Point
{
public float X; //4-bytes
public float Y; //4-bytes.
}
由于struct是一个值类型,我假设它只消耗每个变量所需的内存量,以及CLR使用的一些小的固定量(公共语言运行时) )。
有没有办法计算结构在应用程序运行期间将使用多少内存?也就是说,我知道以下内容:
答案 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>
中粘贴结构,则会有两个对象:列表和列表使用的数组。因此每个对象成本的两倍,加上从列表到数组的指针,加上一个整数来了解当前使用的阵列数量。
如果您在List
或List<object>
中添加结构,则会产生上述开销,加上列表中每个项目的一个指针的成本,加上每个 - 列表中每个项目的对象开销。