如何计算结构实例的大小
本文关键字:实例 结构 何计算 计算 | 更新日期: 2023-09-27 18:00:44
这个问题只是为了满足我的兴趣。阅读"在类和结构之间选择"页面上显示"它的实例大小小于16字节"
给定这个简单的不可变CCD_ 1。
public struct Coordinate
{
private readonly double _latitude;
private readonly double _longitude;
public Coordinate(double latitude, double longitude)
{
_latitude = latitude;
_longitude = longitude;
}
public double Latitude
{
get { return _latitude; }
}
public double Longitude
{
get { return _longitude; }
}
}
属性是否也计入16字节限制?还是只计算字段?
如果后者使用struct
不会违反微软提供的指导方针,因为双字节是8字节?两个双字节将是16字节,这正好是16字节并且不小于16字节。
只计算字段数。
因此,在本例中,您有两个64位(8字节)字段;你只是在你的启发范围内。
请注意,如果您使用任何自动实现的属性,那么编译器将创建"隐藏"字段来支持这些属性,因此您的总总和也应考虑这些属性。
例如,这个结构还需要16个字节:
public struct Coordinate
{
public Coordinate(double latitude, double longitude) : this()
{
Latitude = latitude;
Longitude = longitude;
}
public double Latitude { get; private set; }
public double Longitude { get; private set; }
}
首先,要确定结构的大小,请使用Marshal.SizeOf(struct)
,它返回其成员大小的总和。Microsoft确实建议结构的大小小于16字节,但这实际上取决于您。存在一些与结构相关的开销。如果您的结构有引用类型作为成员,请确保不包括引用类型实例的大小,只包括引用的大小。
您可以使用查找大小
System.Runtime.InteropServices.Marshal.SizeOf(new Coordinate());
返回16。你是对的——只有字段才算数。您可以在不增加大小的情况下添加特性。
您可以使用sizeof( Coordinate )
进行程序计算,尽管这需要不安全的上下文。在您的情况下,大小是16字节,正如您所说。属性不计入大小,因为它们只是包装器。一个结构的大小就是它所有字段大小的总和。