[英]C++ pointer of specific bit size
我的問題是關於指向奇怪大小的內存塊。
假設我有一個像這樣聲明的struct
:
typedef struct{
int32 val1 : 29;
int32 val2 : 26;
char val3;
}MyStruct;
讓我們假設在結構中聲明特定的位字段是可取的(為什么我們使用位字段不是問題)。
如果我想聲明一個指向其中一個字段的指針,我可能會嘗試這樣的事情:
MyStruct test;
int32 *myPtr = &(test.val1);
除此之外產生錯誤“ 不允許使用位字段的地址 ”。
假設我們想要,有沒有辦法以這種方式指向這些領域? 我知道C ++可能會將字段填充到下一個字節(在本例中為32位)。
在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
。
無法獲得指向位字段的指針。 但是,如果您願意自己實現等效結構,則使用移位和掩碼,您應該能夠定義一個智能指針。 就像是:
class BitFieldPointer
{
unsigned* myData;
unsigned myMask;
unsigned myShift;
class DereferenceProxy
{
BitFieldPointer const* myOwner;
public:
DereferenceProxy(BitFieldPointer const* owner) : myOwner( owner ) {} operator unsigned() const
{
return (*myOwner->myData && myOwner->myMask) >> myOwner->myShift;
}
void operator=( unsigned new_value ) const
{
*myData = (*myOwner->myData && ~myOwner->myMask) |
((new_value << myOwner->myShift) && myOwner->myMask);
}
};
public:
// ...
DereferenceProxy operator*() const
{
return DereferenceProxy(this);
}
};
(這只是一個粗略的想法。你可能想要指針和指向const的指針,代理的生命周期與其所有者的生命周期可能是一個問題。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.