C#中bool*的用处

3

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

我的目标是在我的项目中管理自己的内存,具体细节并不重要,只是我想做的事情。现在,我想能够存储自己的变量,并且恰好需要存储布尔值。如何使用unsafe和一个byte*来存储这个布尔值,并最大限度地利用我的空间?理想情况下,将4位存储在字节中。


你可以用代码写下你想做的事吗? - Serkan Hekimoglu
1
我更喜欢使用Nullable<bool>bool?的简写形式。指针在不安全代码中使用。如果您想使用通用约定进行转换,请使用byte b = (someBool ? (byte)1 : (byte)0); - Jaroslav Jandek
只是出于好奇,但为什么你想要管理自己的内存呢?毕竟 C# 的整个理念就是“不需要管理自己的内存”。考虑使用带有 .NET 的 C++,这很容易实现,并且你可以拥有所有想要的自由,包括管理内存。 - Abel
请注意,指针在32位和64位机器上有所不同(尽管您可以在两者上都使用ulong以确保安全)。所有外部变量应该在fixed语句内部,这样它们就不会被GC移动。 - Jaroslav Jandek
1个回答

4
在C#中,通常不会使用bool*,这只能在不安全的代码中使用(这会引发许多其他问题,如固定对象等)。bool*是指向布尔值的指针。指针长为4个字节,不能转换为字节而不丢失信息。

你为什么想要这样做,你在哪里遇到这个问题?通常情况下,在C#中使用指针并没有很好的应用场景,除非你有一个非常特定的需求(例如API调用,但你可以使用P/Invoke解决)。

编辑:(因为你编辑了你的问题。)

以下代码片段展示了如何获取布尔变量的地址以及如何将该指针转换为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的指针)转换为其他东西只能转换为整数或其他四个字节宽度的数据类型。
提示:使用标志可以最好地利用空间:这使枚举类型占用一个标志位,每个字节可以容纳8个布尔值。

注意,对于32位系统,myptraddress 应该是 uint 类型,而对于64位系统,则应该是 ulong 类型。此外,mybool 应该在 unsafe 块之外的 fixed 语句中声明。 - Jaroslav Jandek
@Jaroslav:说得好。关于处理不安全代码还有很多要说的。我想给个小例子,int确实是一个不太好的选择(但不一定是错误的)。请注意,在变量是值类型并且在堆栈上初始化时,不需要使用fixed关键字。 - Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接