簡體   English   中英

sizeof pragma packed bitfield struct array

[英]sizeof pragma packed bitfield struct array

我將Visual Studio 2013用於x64系統。 我有以下結構:

#pragma pack(1)
    struct TimeStruct
    {
      int milliseconds  : 10;
      BYTE seconds      : 6;    
      BYTE minutes      : 6;    
      BYTE hour         : 5;    
      BYTE day          : 5;    
    };
#pragma pack()

和一個數組:

TimeStruct stArray[10];

當我使用sizeof(stArray); 我得到80作為一個突擊而不是40。

我需要知道問題是編譯器沒有正確打包,或者sizeof是否考慮了位域的實際大小。

謝謝

請參閱打包位域時VC ++正在做什么? 有關MSVC如何處理位域的更多解釋。

它的實現依賴於如何打包和排序位域,因此請注意布局可能與您期望的不同,並且取決於您使用的特定編譯器。

sizeof()為您提供結構的大小,無論其成員是什么,因此它的位域包裝與您的期望不同。

您可以從文檔中了解布局或使用此代碼來憑經驗發現布局:

struct TimeStruct a;
unsigned char *b = (unsigned char*)&a;
a.milliseconds = 1;
a.seconds = 2;
a.minutes = 3;
a.hour = 3;
a.day = 4;
for(size_t i = 0; i < sizeof a; i++)
  printf("%02X ", b[i]);

 -> 64 bit compiler 01 00 00 00 02 03 04 05
 -> 32 bit compiler 01 30 FE 00 02 03 A4 65

似乎結構為1. int milliseconds : 10;分配了整個int int milliseconds : 10; 成員,其余3個字節在此之后單獨打包,為每個成員分配BYTE,但不組合來自不同分配單元的位。

如果對所有字段使用int或unsigned int,則應該能夠使用MSVC編譯器將其打包,並且此結構將占用4個字節:

struct TimeStruct
{
  int milliseconds : 10;
  int seconds      : 6;    
  int minutes      : 6;    
  int hour         : 5;    
  int day          : 5;    
};

使用如此定義的類型存儲的位字段。

int milliseconds : 10; // 4 bytes
BYTE seconds      : 6; // 1 byte
BYTE minutes      : 6; // 1 byte
BYTE hour         : 5; // 1 byte
BYTE day          : 5; // 1 byte

這就是MSVC 2013 x64將其存儲在內存中的方式

11111111 11000000 00000000 00000000
11111100 11111100 11111000 11111000

因此,總而言之,您使用8個字節來存儲一個結構。 8x10是80字節。 一切都是正確的。

值得一提的是,gcc表現不同,允許更緊密的包裝。

這里解釋了gcc和MSVC實現之間的區別: 在MSVC中強制未對齊的位域打包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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