Как логические переменные в C# сохранены в памяти? Таким образом, они хранятся как байт, и другие 7 битов потрачены впустую, или, в случае массивов, они сгруппированы в 1-байтовые блоки булевских переменных?
Это отвечает на тот же вопрос относительно Java (Почему булев примитивный размер Java не определяется?). Действительно ли Java и C# являются тем же в этом отношении?
В 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);
}
В C # они хранятся как 1 байт в массиве или поле, но, что интересно, это 4 байта, когда они являются локальными переменными. Я считаю, что однобайтность bool определяется где-то в документах .NET, в отличие от Java. Я полагаю, что причина 4 байтов для локальных переменных состоит в том, чтобы избежать маскировки бит при чтении 32 бита в регистре. Тем не менее, оператор sizeof показывает 1 байт, потому что это единственный подходящий размер, а все остальное - детали реализации.