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

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

Отвечает на тот же вопрос относительно Java (Почему размер логического примитива Java не определен?). Являются ли Java и С# одинаковыми в этом отношении?

2 ответа

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

Например, следующие наборы i to 4:

struct Foo
{
 public bool A, B, C, D;
}
static unsafe void Main()
{
 int i = sizeof(Foo);
}


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

licensed under cc by-sa 3.0 with attribution.