簡體   English   中英

特定位大小的C ++指針

[英]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::bitsetboost::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM