10

我正处于这个 C 项目的中间,我希望提高内存效率。在某些情况下,我使用我编写的动态数组结构的 void *s 来保存位。我希望使用所有 64(在这种情况下)位。

我很快意识到你实际上不能对指针进行任何位操作。所以我的解决方案如下:

void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;

这可以完成工作,但这只是因为在我的计算机上,长整数和指针的大小相等。在所有(或大多数)架构中都会出现这种情况吗?

我真正的问题是:有没有更正确的方法来对指针进行位操作? 我曾认为这种方法在 C 中有些常见(将位打包到 void * 中),但我可能弄错了......

4

4 回答 4

17

如果您的编译器支持它,C99 的<stdint.h>头文件提供的intptr_tuintptr_t类型应该足够大以在您的系统上保存一个指针,但它们是整数,因此您可以进行位操作。如果这就是您正在寻找的,它真的不能比这更便携。

于 2009-12-04T06:20:54.660 回答
8

如果您需要对指针进行这种操作,您可以将它们转换为intptr_tand uintptr_t,两者都可以在stdint.h. 这些保证被​​定义为特定于平台的整数类型,具有足够的位来保存指针。

ptrdiff_t如果你需要一些东西来保持两个指针之间的差异,也在那里。

于 2009-12-04T06:23:20.380 回答
3

我认为您正在尝试解决错误的问题。真正的问题就在这里:

我正在使用我编写的动态数组结构的 void *s 来保存位。

不要使用 void 指针来保存位。使用 void 指针来保存指针。使用无符号整数来保存位。

于 2009-12-04T06:49:58.750 回答
2

声明指针和位域的联合。

于 2009-12-04T06:22:52.450 回答