是由於結構體沒有的對齊標準未指定;
關於 #param pack n:
#pragma pack(4)
class testb
; int nsize = sizeof(testb);
這裡nsize結果為12,在預料之中。
現在去掉第乙個成員變數為如下**:
#pragma pack(4)
class testc
; int nsize = sizeof(testc);
按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?
事實上,很多人對#pragma pack的理解是錯誤的。
關於struct的使用方法
struct是一種復合資料型別,其構成元素既可以是基本資料型別(如int、long、float等)的變數,也可以是一些復合資料型別(如array、struct、union等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界(natural alignment)條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。
自然對界是指按結構體的成員中size最大的成員對齊。
結構,聯合,或者類的資料成員,第乙個放在偏移為0的地方,以後每個資料成員的對齊,按照#pragma pack指定的數值和結構體的自然對齊長度中比較小的那個進行。
也就是說,當#pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。
結構體的對齊,按照結構體中size最大的資料成員和#pragma pack指定值之間,較小的那個進行。
具體解釋
class testb
; 這個類實際佔據的記憶體空間是9位元組
類之間的對齊,是按照類內部最大的成員的長度,和#pragma pack規定的值之中較小的乙個對齊的。
所以這個例子中,類之間對齊的長度是min(sizeof(int),4),也就是4。
9按照4位元組圓整的結果是12,所以sizeof(testb)是12。
如果class testb
; //可以看出,上面的位置完全沒有變化,只是類之間改為按2位元組對齊,9按2圓整的結果是10。
//所以 sizeof(testb)是10。
最後看原貼:
現在去掉第乙個成員變數為如下**:
#pragma pack(4)
class testc
; //整個類的大小是5位元組,按照min(sizeof(short),4)位元組對齊,也就是2位元組對齊,結果是6
//所以sizeof(testc)是6。
在linux下面就是
typedef struct test ;
typedef struct test1;
gcc test.c 編譯後,它們的大小就是7,8了
windows下面預設的是#pragma pack(8)
因為編譯器在編譯時會對程式進行優化,以便加快訪問速度,所以一般都會按照2的倍數進行位元組對齊。用這個巨集就是為了防止編譯器對結構的定義進行對齊。
STM32資料位錯位問題研究
不久前,本人需要用多路stm32adc取樣,用dma傳輸,發現資料錯位問題,真的很惱火。有時候發現adc位錯一位的有,錯兩位的有,也有三位四位的,查查網上大神,一般都是說adc不能在連續轉換模式下工作就ok了,但是我程式的問題依舊。前幾天,不經意間發現,原來我程式的adc轉換是先早開於dma轉換的。...
STM32中的memcpy函式的使用
最近在用jy61做乙個傾角專案。剛好商家那裡有個示例 有寫這個函式。正好給大家講下這個函式是怎麼用的。上面這個圖呢,是我從商家那裡擷取出來的。什麼意思呢 給大家講下。memcpy 函式用於 把資源記憶體 src所指向的記憶體區域 拷貝到目標記憶體 dest所指向的記憶體區域 拷貝多少個?有乙個siz...
STM32 CAN通訊問題
檢舉 2012 07 04 20 59 breath123 分類 工程技術科學 瀏覽974次 can通訊測試中 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴充套件id不是如下的就拋棄掉,是的話,會存入fifo0。can filterinitstructure.can filteridhigh...