3

bool*意味のある方法で使用できますか。たとえば、どのように変換bool*するか、バイトに保存しますかbytebool*

私の目標は、自分のプロジェクトで自分の記憶を管理することです。詳細は重要ではありません。やりたいことだけです。今、私は自分の変数を保存できるようにしたいのですが、たまたまブール値を保存する必要があります。unsafeと を使用してbyte*、このブール値を保存し、スペースを最大限に活用するにはどうすればよいですか? 理想的には、バイトに 4 ビットを格納します。

4

1 に答える 1

4

C# では、通常は abool*を使用しません。これは、安全でないコードでのみ使用できるものです (オブジェクトのピン留めなど、他の多くのものをもたらします)。Abool*はブール値へのポインターになります。ポインターは 4 バイトの長さであり、損失なしでバイトに変換することはできません。

なぜこれをしたいのですか、そしてどこでこれに遭遇しますか? 通常、C# でポインターを使用するユース ケースは、非常に具体的な要求 (つまり、API 呼び出しで、P/Invoke を使用して解決できる) がない限り、簡単にはありません。

編集: (q を編集したため)

次のコード スニペットは、ブール変数のアドレスを取得する方法と、そのポインターを に変換する方法を示していますint(変換byteは不可能です。4 バイトが必要です)。

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;
}

あなたは「理想的には1バイトに4ビットを格納する」と言います。4 ビットのマシン アーキテクチャを使用している場合を除き、ブール値の取得と格納が非常に遅くなるため、強くお勧めしません。しかし、もっと重要なことは、ここでは C++ ではなく C# について話しているということです。C# は、ブール値がバイトとして格納され、各メモリ アドレスが 32 ビット アーキテクチャで 4 バイト長であることを示す CLR にバインドされています。つまり、ポインターは 4 バイト長です。したがって、bool* (bool へのポインター) を別のものに変換する質問は、4 バイト幅の整数またはその他のデータ型にのみ変換できます。

ヒント: フラグを使用すると、スペースを最大限に活用できます。これにより、列挙型がフラグごとに少し占有され、バイトごとに 8 つのブール値が得られます。

于 2010-07-11T10:28:32.783 に答える