位段 修改預設對齊數(對結構體的一點補充)

2021-10-06 03:49:19 字數 743 閱讀 7609

#pragma pack (1)//預設對齊數修改為4,改為 1 即為沒對齊,一般修改為2,4,6……

struct s3 ;

#pragma pack()//取消預設對齊數的修改

函式傳參時,引數是需要壓棧的。如果傳遞乙個結構體物件的時候,結構體過大,引數壓棧的系統開銷較大,就會導致效能的下降

結構體 傳參的時候,要傳結構體的位址

位段的宣告和結構體是類似的,但是有兩個不同:

1.位段的成員必須是 int、unsigned int或signed int 、char。

2.位段的成員名後邊有乙個冒號和乙個數字。

比如:struct a ;

a就是乙個位段型別

冒號後邊的數字表示要儲存 _a 需要兩個位元組, _b 需要3個位元組

位段的成員可以是 int、unsigned int或signed int 、char(屬於整形家族)類

位段的空間上是按照需要以4個位元組(int)或者1個位元組(char)的方式來開闢的

位段涉及很多不確定因素,位段是不跨平台的,可移植的程式應避免使用位段

vs中多餘位段不會被捨棄

增加**的可讀性和可維護性

和 #define 定義的識別符號比較列舉有型別檢查,更加嚴謹

防止了命名汙染(封裝)

便於除錯

使用方便,一次可以定義多個常量

對結構體及位段的認識

在c語言裡為了描述一些現實生活中比較複雜的東西,往往需要用到結構體。結構體就是使用者自己建立的由不同資料型別組成的組合型資料結構。比如 描述乙個學生,可能需要描述他的學號,姓名,成績等。一.宣告及定義結構體變數 有三種方法定義結構體變數 1.先宣告結構體型別,再定義該型別的變數,例如 struct ...

結構體中的位段

在結構體中以二進位制為單位指定成大小的方式,稱為 位段或位域。有時資料的儲存用不了乙個或多個位元組,如表示真假時,只需要乙個位元位即可。本質還是為了節省空間 注意 位段不跨平台 1.位段的成員必須為unsigned 無符號 或int,char型別 2.位段的成員名後邊有乙個冒號和乙個數字 這個數字為...

結構體大小計算(記憶體對齊問題和修改預設對齊數)

結構體中如何計算結構體大小呢?那麼首先應該理解並掌握結構體的對齊規則,為什麼陣列中不需要對齊有人會問,這是因為陣列中放入的是同型別的資料,比如字串陣列,字元陣列,指標陣列,數值陣列等。而結構體中存放的是不同型別的資料,比如結構體成員列表可為陣列,指標,整型,字元型,浮點型等組合。總體來說結構體的記憶...