我能以任何有意义的方式使用 bool*
吗?例如,我如何将 bool*
转换为 byte
,或者将 bool*
存储在一个字节中
我的目标是在我的一个项目中管理我自己的内存,具体细节并不重要,只是我喜欢做的事情。现在我希望能够存储我自己的变量,而我恰好需要存储一个 boolean 值。我如何使用 unsafe
和 byte*
存储这个 boolean 值,并最好地利用我的空间?理想情况下在字节中存储 4 位。
最佳答案
在 C# 中,您通常不会使用 bool*
,这是您只能在不安全代码中使用的东西(它会带来很多其他东西,例如固定对象等等)。 bool*
是指向 boolean 值的指针。指针有 4 个字节长,不能无损地转换为字节。
你为什么要这样做,你在哪里遇到的?通常,在 C# 中使用指针的用例并不容易,除非您有非常具体的需求(即 API 调用,但您可以使用 P/Invoke 解决)。
编辑:(因为您编辑了问题。)
以下代码片段向您展示了如何获取 boolean 变量的地址以及如何将该指针转换为 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 位机器架构,否则我强烈建议不要使用它,因为它会使检索和存储 boolean 值变得非常慢。但更重要的是:您在这里谈论的是 C#,而不是 C++。 C# 绑定(bind)到 CLR,CLR 声明 boolean 值存储为字节,并且每个内存地址在 32 位体系结构中的长度为四个字节,这意味着指针长度为四个字节。因此,您的问题是,将 bool*(指向 bool 的指针)转换为其他内容只能转换为整数或其他四字节宽的数据类型。
提示:使用标志可以最好地利用空间:这使得枚举类型为每个标志占用一点空间,从而为每个字节提供八个 boolean 值。
关于c# - C# 中 bool* 的用处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3222676/