特定位大小的C++指针

use*_*577 5 c++ struct pointers bit-fields

我的问题是关于指向奇怪大小的内存块.

假设我有这样的struct声明:

typedef struct{
   int32 val1  : 29; 
   int32 val2  : 26;
   char  val3;
}MyStruct;
Run Code Online (Sandbox Code Playgroud)

让我们假设在结构中声明特定的位字段是可取的(为什么我们使用位字段不是问题).

如果我想声明一个指向其中一个字段的指针,我可能会尝试这样的事情:

MyStruct test;
int32 *myPtr = &(test.val1);
Run Code Online (Sandbox Code Playgroud)

除此之外产生错误" 不允许使用位字段的地址 ".

假设我们想要,有没有办法以这种方式指向这些领域?我知道C++可能会将字段填充到下一个字节(在本例中为32位).

Alo*_*ave 11

在C++中,最小可寻址值的大小必须至少为1个字节.所以不,你不能用指针获取位字段的地址.

C++ 03标准9.6位域:
第3段:

...运算符地址&不应用于位域,因此没有指向位域的指针.....


dir*_*tly 6

除此之外产生错误"不允许使用位字段的地址".

标准明确禁止这一点.见[class.bit] 9.6/3:

地址 - 运算符&不应用于位域,因此没有指向位域的指针.

一个字节(CHAR_BIT位宽,CHAR_BIT至少为8)是您可以解决的最小值.

假设我们想要,有没有办法以这种方式指向这些领域?

不可以.但是,您可以指向封闭struct类型的对象.这是C的直接结转; 见C FAQ 2.26:

当你还希望能够整体操作一些位集合时(或许复制一组标志),位字段是不方便的.

您可能希望查看其他替代方案std::bitsetboost::dynamic_bitset.