我可以以任何有意义的方式使用bool*
吗?我如何将bool*
转换为byte
,或将bool*
存储在一个字节中
我的目标是在我的项目中管理自己的记忆,细节并不重要,只是喜欢做的事情。现在我希望能够存储我自己的变量,而我恰好需要存储一个布尔值。我如何使用unsafe
和byte*
存储此布尔值,并最好地利用我的空间?理想情况下,在字节中存储4位。
答案 0 :(得分:4)
在C#中你通常不会使用bool*
,这是你只能在不安全的代码中使用的东西(它带来了许多其他东西,如固定对象等等)。 bool*
将是指向布尔值的指针。指针长度为4个字节,无法在没有丢失的情况下转换为字节。
你为什么要这样做?你在哪里遇到这个?通常情况下,在C#中使用指针并不容易,除非您有非常特殊的需求(即API调用,但您可以使用P / Invoke解决)。
编辑:(因为您编辑了q。)
以下代码片段向您展示了如何获取布尔变量的地址以及如何将该指针转换为int
(转换为byte
是不可能的,我们需要四个字节)。< / p>
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的指针)转换为其他内容只能转换为整数或其他四字节宽的数据类型。
提示:使用标记可以最大限度地利用空间:这会使枚举类型占用每个标志一点,这为每个字节提供了8个布尔值。