c# - C# 中 bool* 的用处

标签 c# byte unsafe boolean

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

我的目标是在我的一个项目中管理我自己的内存,具体细节并不重要,只是我喜欢做的事情。现在我希望能够存储我自己的变量,而我恰好需要存储一个 boolean 值。我如何使用 unsafebyte* 存储这个 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/

相关文章:

java - 为什么 sun.misc.Unsafe 存在,在现实世界中如何使用?

c# - asp.net mvc 自定义属性中的执行优先级

c# - 创建包提交到 Windows Phone 8.1 商店时出错

c# - 需要从互操作 dll 中查找 COM DLL

c# - Membership.GetUser() 在应用程序启动时返回 null

java - 将字节(java 数据类型)值转换为位(仅包含 8 位的字符串)

c# - VB.Net 中的不安全

C# 不安全类型 -> char*[] ,获取 char 数组上的指针

python - 写入后无法使用 go 从文件中读取字节

java - 如何使用 Java 服务器将图像发送到 Android 设备