我可以以任何有意义的方式使用bool*
吗?例如,我如何将bool*
转换为byte
,或者将bool*
存储在一个字节中。
我的目标是在我的项目中管理自己的内存,具体细节并不重要,只是我想做的事情。现在,我想能够存储自己的变量,并且恰好需要存储布尔值。如何使用unsafe
和一个byte*
来存储这个布尔值,并最大限度地利用我的空间?理想情况下,将4位存储在字节中。
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;
}
myptraddress
应该是 uint
类型,而对于64位系统,则应该是 ulong
类型。此外,mybool
应该在 unsafe
块之外的 fixed
语句中声明。 - Jaroslav Jandekint
确实是一个不太好的选择(但不一定是错误的)。请注意,在变量是值类型并且在堆栈上初始化时,不需要使用fixed
关键字。 - Abel
Nullable<bool>
或bool?
的简写形式。指针在不安全代码中使用。如果您想使用通用约定进行转换,请使用byte b = (someBool ? (byte)1 : (byte)0);
。 - Jaroslav Jandekulong
以确保安全)。所有外部变量应该在fixed
语句内部,这样它们就不会被GC移动。 - Jaroslav Jandek