Как байтовые переменные хранятся в памяти? - PullRequest
6 голосов
/ 05 декабря 2010

Я читаю книгу о C # ( Pro C # и платформе .NET 4 Эндрю Троелсена ), и я только что прочитал этот абзац:

ИзменениеБазовый тип перечисления может быть полезен, если вы создаете приложение .NET, которое будет развернуто на устройстве с малым объемом памяти (например, на сотовом телефоне с поддержкой .NET или КПК), и вам необходимо по возможности экономить память.

Правда ли, что байты используют меньше памяти?Разве они не хранятся на 4 байтах по соображениям производительности?Я помню, что где-то читал последнее, но не могу найти никакой информации об этом, даже в спецификации C #.

Ответы [ 4 ]

7 голосов
/ 05 декабря 2010

Это не просто.Как переменные в методе, они почти такие же, как int, поэтому 4 байта;внутри массива они однобайтовые.Как поле ... Мне нужно проверить; I думаю, заполнение означает, что они могут рассматриваться как 4-байтовые. A struct с sizeof должно показывать ...

struct Foo {
    byte a, b, c;
}
static class Program {
    unsafe static void Main() {
        int i = sizeof(Foo); // <==== i=3
    }
}

Здесь i показывает 3, поэтому они являются однобайтовыми полями, но (см. комментарии codymanix) могут потребоваться дополнительные отступы, когда задействованы другие типы - например:

struct Foo
{
    byte a, b, c;
    int d;
}

равно 8 байтов, из-за необходимости d для выравнивания.Веселье, веселье, веселье.

2 голосов
/ 05 декабря 2010

Я не думаю, что это явно определяется спецификацией C # или даже .NET. Вы должны использовать атрибуты StructLayout и FieldOffset , чтобы указать точный план памяти

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct TestDByte
{
    public double a;
    public byte b;
}
2 голосов
/ 05 декабря 2010

Я думаю, это зависит от целевой платформы. На устройствах с низким объемом памяти CLR может выбрать плотную упаковку, поэтому он сохранит память, если вы измените тип перечисления.

1 голос
/ 05 декабря 2010

Байты не должны быть выровнены для эффективной работы на процессорах x86 (хотя большие блоки делают это).Для других архитектур ЦП все может работать по-другому.

...