Полезность bool * в C # - PullRequest
       34

Полезность bool * в C #

3 голосов
/ 11 июля 2010

Могу ли я использовать bool* любым осмысленным способом.Как мне преобразовать, например, bool* в byte или сохранить bool* в байте

Моя цель - управлять собственной памятью в моем проекте, детали не важныпросто то, что я хотел бы сделать.Теперь я хотел бы иметь возможность хранить свои собственные переменные, и мне нужно хранить логическое значение.Как я могу, используя unsafe и byte*, сохранить это логическое значение и наилучшим образом использовать мое пространство?Идеально хранить 4 бита в байте.

1 Ответ

4 голосов
/ 11 июля 2010

В C # вы обычно не используете bool*, который вы можете использовать только в небезопасном коде (который порождает множество других вещей, таких как закрепление объектов и т. Д.).bool* будет указателем на логическое значение.Указатель имеет длину 4 байта и не может быть преобразован в байт без потерь.

Зачем вам это нужно и где вы сталкиваетесь с этим?Как правило, нет простого варианта использования указателей в C #, если только у вас нет особых требований (например, вызов API, но вы можете решить это с помощью P / Invoke).

EDIT: (потому что вы отредактировали q.)

В следующем фрагменте кода показано, как получить адрес логической переменной и как преобразовать этот указатель в int (преобразование в byte не являетсявозможно, нам нужно четыре байта).

unsafe
{
    // get pointer to boolean
    bool* boolptr = &mybool;                

    // get the int ptr (not necessary though, but makes following easier)
    int* intptr = (int*)boolptr;

    // get value the pointer is pointing at
    int myint = *intptr;

    // get the address as a normal integer
    int myptraddress = (int) intptr;
}

вы говорите "в идеале хранить 4 бита в байте".Если у вас нет 4-битной машинной архитектуры, я бы настоятельно советовался против нее, потому что это сделает поиск и хранение логических значений очень медленным.Но что более важно: вы говорите здесь на C #, а не на C ++.C # связан с CLR, в котором говорится, что логическое значение сохраняется в виде байта и что каждый адрес памяти имеет длину четыре байта в 32-битных архитектурах, что означает, что указатели имеют длину четыре байта.Следовательно, ваш вопрос о преобразовании bool * (указателя на bool) во что-то другое можно преобразовать только в целочисленный или другой тип данных шириной в четыре байта.

Совет: используя флаги, вы можете наилучшим образом использовать пространство: это заставляет типы enum занимать немного для каждого флага, что дает вам восемь логических значений для каждого байта.

...