Как рассчитать размер экземпляра структуры? - PullRequest
3 голосов
/ 29 июня 2011

Этот вопрос просто для удовлетворения моего интереса. Чтение Выбор между классами и структурами на странице написано: «Размер экземпляра меньше 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, то не сможет выполнить указания, предоставленные Microsoft, так как значение типа double равно 8 байтам? Два двойных числа будут 16 байтов, что составляет ровно 16 байтов и не меньше.

Ответы [ 4 ]

4 голосов
/ 29 июня 2011

Только количество полей.

Итак, в этом случае у вас есть два 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; }
}
2 голосов
/ 29 июня 2011

Во-первых, чтобы определить размер вашей структуры, используйте Marshal.SizeOf(struct), которая возвращает сумму размеров ее членов.Microsoft рекомендует, чтобы размер структуры был меньше 16 байт , но это действительно ваше дело.Есть некоторые накладные расходы, связанные со структурами.Если ваша структура имеет ссылочные типы в качестве членов, убедитесь, что вы не включили размер экземпляров ссылочных типов, а только размер ссылок.

1 голос
/ 29 июня 2011

Вы можете использовать sizeof( Coordinate ), чтобы вычислить его программно, хотя это потребует небезопасного контекста. В вашем случае размер составляет 16 байтов, как вы сказали. Свойства не учитываются в размере, так как они являются только обертками. Размер структуры - это просто сумма размеров всех ее полей.

1 голос
/ 29 июня 2011

Вы можете узнать размер, используя

System.Runtime.InteropServices.Marshal.SizeOf(new Coordinate());

Что возвращает 16. Вы правы - учитываются только поля. Вы можете добавить свойства без увеличения размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...