QT の構造体の送信によって占有されるバイトに関する問題

序文

最近、ホスト コンピュータを介してデータを送信したときに、受信データの余分なビット数について疑問がありました。sizeof を使用して占有バイト サイズを確認すると、それが実際に送信されるべきものと同じではないことがわかります。後で関連情報を調べて、その理由のこの部分が理解できたので、ここに記録しておきます。


1. 構造サイズの問題

struct EDWINWZY
    {
        uint64_t A=500;
        struct Test {
            uint16_t B;
            uint16_t C;
        } test;
    }edwinwzy;

错误想法:構造体のサイズ 8+2+2=12 バイト。
原因:構造体のサイズを計算するときは、そのメモリ レイアウトを考慮する必要があります。構造体はユニット単位でメモリに格納されます。各ユニットのサイズは、構造体の最大の基本型のサイズによって異なります。 . . A は uint64_t 型で、64 ビットで 8 バイトを占有しますが、これは正しいです。B と C はどちらも uint16_t で 2 バイトを占めていますが、これは正しいです。ただし、B+C=32bit < 64bit (最大の基本型) であるため、この構造体は実際には 2 つのユニット サイズ、つまり 2*8=16 バイトを占有します。

拡張すると、sizeof(edwinwzy) を実行すると、結果は 16 になるはずですが、edwinwzy 構造体オブジェクトのテストで sizeof を実行すると、結果は 4 になります。これは、sizeof を使用する場合、ターゲットが構造体であるためです。 Test、この構造体の最大の基本型は uint16_t で、BC は同じ型であるため、両方とも構造体 Test のユニットを占有するため、4 になります。


2. ビットフィールド追加後の構造サイズ

struct EDWINWZY
    {
        uint64_t A=500;
        struct Test{
            uint16_t B:1;
            uint16_t C:1;
            uint16_t D:1;
            uint16_t E:1;
            uint16_t F:1;
        } test;
    }edwinwzy;

错误想法:構造体サイズが占めるビット数: 64+1+1+1+1+1=69 ビット、69 ビットは 9 バイトです。
原因:質問 1 と同様に、構造体のメモリ レイアウトに関係しますが、この構造体の最大の基本型のサイズも uint64_t で、8 バイトを占めます。
したがって、ここでの EDWINWZY 構造体のサイズは実際には 16 バイトです。

同様に、テスト構造体で sizeof を使用します。
間違った考え: ビット フィールドが使用されているため、構造内で 5 ビットのみが使用され、1 バイトを占有する必要があります。
理由: 構造体 Test 内の最大の基本型のサイズは uint16_t で、2 バイトを占めます。したがって、構造内の記憶単位は 2 バイトです。ここではビット フィールドが使用されており、占有するのは 5 ビットだけですが、構造体 Test の記憶ユニットの長さは 2 バイトであるため、ここでの sizeof(Test) は依然として 2 バイトであり、これは uint16_t の長さです。


3. もう少しビットを増やしてデータを送信する

上記の質問 2 の場合、実際のデータは 64+5=69 ビットのみですが、構造体のサイズは 128 ビット (uint64_t*2) を占め、不足している 59 ビットは 0 で埋められます。
したがって、ここで受信したデータには 0 のビットがさらに多く含まれます。

要約する

この問題に遭遇するのは初めてです。C 言語を学習していたときは、メモリ割り当ての問題を考慮せず、メモリの詳細についてもあまり深く掘り下げませんでした。今回この問題に遭遇したら、丁寧に解決させていただきます。

おすすめ

転載: blog.csdn.net/Edwinwzy/article/details/131667902