Linux 位元組序與位元組對齊優化

2021-06-07 13:56:25 字數 1795 閱讀 6068

1.位元組序跟linux/windows無關, 是由cpu構架決定!! 同乙個cpu不管裝的是windows 或 linux 位元組序都是一樣的!

2.位元組對齊 linux 全用__attribute__((packed))作用於結構體,類似於pragma packet(1) 使用方法如下:

typdef struct mystruct __attribute__((packed)) omystruct;

其中,omystruct 在其後未得到此種效果.

另外也可以使用編譯選項: -fpack-struct 進行全域性設定,但優先順序沒__attribute__((packed))高!

注意:__attribute__((packed)) 前後都是雙下劃線且是雙括號!

下邊是轉的關於__attribut__((packet))更詳細的內容:

__attrubte__ ((packed)) 的作用就是告訴編譯器取消結構在編譯過程中的優化對齊,按照實際占用位元組數進行對齊。

#define __u8    unsigned char

#define __u16   unsigned short

/* __attribute__ ((packed)) 的位置約束是放於宣告的尾部「;」之前 */

struct str_struct __attribute__ ((packed));

/*  當用到typedef時,要特別注意__attribute__ ((packed))放置的位置,相當於:

*  typedef struct str_stuct str;

*  而struct str_struct 就是上面的那個結構。 */

typedef struct __attribute__ ((packed)) str;

/* 在下面這個typedef結構中,__attribute__ ((packed))放在結構名str_temp之後,其作用是被忽略的,注意與結構str的區別。*/

typedef struct str_temp __attribute__ ((packed));

typedef struct str_nopacked;

int main(void)

編譯執行:

引用:[root@localhost root]# ./packedtest   

sizeof str = 5

sizeof str_struct = 5

sizeof str_temp = 6

sizeof str_nopacked = 6

gnu c的一大特色就是__attribute__機制。__attribute__可以設定函式屬性(function attribute)、變數屬性(variable attribute)和型別屬性(type attribute)。

__attribute__書寫特徵是:__attribute__前後都有兩個下劃線,並且後面會緊跟一對括弧,括弧裡面是相應的__attribute__引數。

__attribute__語法格式為:

__attribute__ ((attribute-list))

其位置約束:放於宣告的尾部「;」之前。

函式屬性(function attribute):函式屬性可以幫助開發者把一些特性新增到函式宣告中,從而可以使編譯器在錯誤檢查方面的功能更強大。__attribute__機制也很容易同非gnu應用程式做到相容之功效。

gnu cc需要使用 –wall編譯器來擊活該功能,這是控制警告資訊的乙個很好的方式。

packed屬性:使用該屬性可以使得變數或者結構體成員使用最小的對齊方式,即對變數是一位元組對齊,對域(field)是位對齊。

位元組序與位元組對齊

一.網路位元組序與主機位元組序 1.大端和小端儲存 大端 big endian 高位存低位址。符合人類的正常思維。網路位元組序採用大端 網路傳輸的是位元組流 小端 littile endian 低位存低位址。如果將乙個32位的整數0x12345678存放到乙個整型變數 int 中,這個整型變數採用大...

位元組對齊 位域 位元組序

測試環境 win 7 64bits,vmware workstation 12 pro,ubuntu 15.10 64bits,使用gcc version 5.2.1 20151010 include pragma pack 1 14,11,11 pragma pack 2 16,12,12 pra...

Linux 主機位元組序與網路位元組序

現在的cpu累加器一次能夠裝載至少4個位元組的乙個整數,那麼位元組在記憶體中的排列順序不同,導致累加器使用的結果不同,這就是位元組序問題 例如 我們儲存乙個int型別的數字 int a 1 大端位元組序 整數的高位位元組存放在記憶體的低位址位。小端位元組序 整數的低位位元組存放在記憶體位址的低位址為...