在c/c++下編譯器會預設地對結構體進行對齊,其對齊的方法跟平台具體的特性有關,本文主要介紹結構體不進行對齊的方法。
1、結構體位元組不進行對齊的用途
(1)、減小記憶體占用的空間
結構體預設進行對齊,占用的空間比結構體內部成員變數位元組加起來大,如果取消位元組對齊,可以減小一部分空間。見下面具體例子。
(2)、直接將結構體作為通訊協議(在低頻寬下通訊)
在不同的平台下,保證結構體內基本資料的長度相同,同時取消結構體的對齊,就可以將定義的資料格式結構體直接作為資料通訊協議使用。
2、結構體位元組不對齊的方法
利用偽指令#pragma pack (n)可以動態的調整記憶體對齊的方式:
#pragma pack (n)
// 編譯器將按照n個位元組對齊;
#pragma pack()
// 恢復先前的pack設定,取消設定的位元組對齊方式
#pragma pack(pop)
// 恢復先前的pack設定,取消設定的位元組對齊方式
#pragma pack(1)
// 按1位元組進行對齊 即:不行進行對齊
3、使用示例:#include
#pragma pack (1)
typedef
struct testnoalign
testnoalign;
#pragma pack ()
typedef
struct testalign
testalign;
intmain
(void
)return0;
}
編譯執行
root@root:/root# ./test
sizeof(testnoalign) is 13 sizeof(testalign) is 16
c c 下取消結構體位元組對齊方法
c c 下取消結構體位元組對齊方法 在c c 下編譯器會預設地對結構體進行對齊,其對齊的方法跟平台具體的特性有關,本文主要介紹結構體不進行對齊的方法。1 結構體位元組不進行對齊的用途 1 減小記憶體占用的空間 結構體預設進行對齊,占用的空間比結構體內部成員變數位元組加起來大,如果取消位元組對齊,可以...
C C 結構體位元組對齊
注 最近在做uvc描述符的編輯工具,用到很多的結構,為了方便把結構體寫成bin檔案,需要把結構體中填充的位元組去掉,在網上搜尋得到這篇文章,感覺挺好的,轉過來做個紀念。結構體 struct 的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到儲存空間的位元組對齊問題。先看下面定義的...
C C 中結構體位元組對齊原理
首先看下面定義的結構體所佔空間記憶體的大小是多少呢?include using namespace std struct student 定義結構體 stu int main 可能會有人說,1 4 5,不就5嗎,然而,實際通過sizeof運算子得到的答案是 8 為什麼會這樣?通過記憶體空間分配來說明...