如何计算struct实例的大小?

时间:2011-06-29 13:09:08

标签: c# struct

这个问题只是为了满足我的兴趣。阅读页面Choosing Between Classes and Structures说“它的实例大小小于16个字节。”。

鉴于这个简单的不可变struct

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个字节而不是更少。

4 个答案:

答案 0 :(得分:4)

只是字段数。

所以在这种情况下你有两个64位(8字节)字段;你只是在启发式的范围内。

请注意,如果您使用任何auto-implemented properties,那么编译器将创建“隐藏”字段来支持这些属性,因此您的总和也应考虑到这些。

例如,此结构也需要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; }
}

答案 1 :(得分:2)

首先,要确定结构的大小,请使用Marshal.SizeOf(struct)返回其成员大小的总和。 Microsoft确实建议结构be below 16 bytes的大小,但它真的取决于你。结构有一些开销。如果您的struct具有引用类型作为成员,请确保不包括引用类型实例的大小,只包括引用的大小。

答案 2 :(得分:1)

您可以使用

找出尺寸
System.Runtime.InteropServices.Marshal.SizeOf(new Coordinate());

返回16.你是对的 - 只有字段数。您可以在不增加大小的情况下添加属性。

答案 3 :(得分:1)

您可以使用sizeof( Coordinate )来计算它,但这需要不安全的上下文。在你的情况下,大小是16字节,如你所说。属性不计入大小,因为它们只是包装器。结构的大小只是其所有字段大小的总和。