Примитивный булев размер в C#

Как логические переменные в C# сохранены в памяти? Таким образом, они хранятся как байт, и другие 7 битов потрачены впустую, или, в случае массивов, они сгруппированы в 1-байтовые блоки булевских переменных?

Это отвечает на тот же вопрос относительно Java (Почему булев примитивный размер Java не определяется?). Действительно ли Java и C# являются тем же в этом отношении?

32
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

В C #, конечно, биты не упакованы по умолчанию, поэтому несколько полей типа bool будут принимать каждое 1 байт. Вы можете использовать BitVector32 , BitArray или просто побитовую арифметику, чтобы уменьшить эти накладные расходы. Как переменные , как я припоминаю, они занимают 4 байта (по существу обрабатываются как int = Int32 ).

Например, в i устанавливается значение 4:

struct Foo
{
    public bool A, B, C, D;
}
static unsafe void Main()
{
    int i = sizeof(Foo);
}
32
ответ дан 27 November 2019 в 20:47
поделиться

В C # они хранятся как 1 байт в массиве или поле, но, что интересно, это 4 байта, когда они являются локальными переменными. Я считаю, что однобайтность bool определяется где-то в документах .NET, в отличие от Java. Я полагаю, что причина 4 байтов для локальных переменных состоит в том, чтобы избежать маскировки бит при чтении 32 бита в регистре. Тем не менее, оператор sizeof показывает 1 байт, потому что это единственный подходящий размер, а все остальное - детали реализации.

19
ответ дан 27 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: