如何计算结构实例的大小

本文关键字:实例 结构 何计算 计算 | 更新日期: 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字节,正如您所说。属性不计入大小,因为它们只是包装器。一个结构的大小就是它所有字段大小的总和。