3

我可以bool*以任何有意义的方式使用吗?我将如何转换bool*byte例如,或存储bool*在一个字节中

我的目标是在我的一个项目中管理我自己的记忆,细节并不重要,只是我喜欢做的事情。现在我希望能够存储我自己的变量,而我恰好需要存储一个布尔值。我如何使用unsafe和 abyte*存储这个布尔值,并最好地利用我的空间?理想情况下,在字节中存储 4 位。

4

1 回答 1

4

在 C# 中,您通常不会使用 a bool*,这是您只能在不安全的代码中使用的东西(这会带来很多其他的东西,比如固定对象等等)。Abool*将是一个指向布尔值的指针。指针有 4 个字节长,不能无损失地转换为字节。

你为什么要这样做,你在哪里遇到这个?通常,除非您有非常具体的需求(即 API 调用,但您可以使用 P/Invoke 解决),否则在 C# 中使用指针并不容易。

编辑:(因为你编辑了你的 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 的指针)转换为其他内容只能转换为整数或其他四个字节宽的数据类型。

提示:使用标志可以最好地利用空间:这使得枚举类型占用每个标志位,这为每个字节提供了八个布尔值。

于 2010-07-11T10:28:32.783 回答