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段:
...运算符地址&不应用于位域,因此没有指向位域的指针.....
除此之外产生错误"不允许使用位字段的地址".
标准明确禁止这一点.见[class.bit] 9.6/3:
地址 - 运算符&不应用于位域,因此没有指向位域的指针.
一个字节(CHAR_BIT位宽,CHAR_BIT至少为8)是您可以解决的最小值.
假设我们想要,有没有办法以这种方式指向这些领域?
不可以.但是,您可以指向封闭struct类型的对象.这是C的直接结转; 见C FAQ 2.26:
当你还希望能够整体操作一些位集合时(或许复制一组标志),位字段是不方便的.
您可能希望查看其他替代方案std::bitset或boost::dynamic_bitset.