C C 之struct的小知識

2021-10-08 02:16:02 字數 2130 閱讀 2052

1.1 自然對界

struct 是一種復合資料型別,其構成元素既可以是基本資料型別(如 int、long、float 等)的變數,也可以是一些復合資料型別(如 array、struct、union 等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界(natural alignment)條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同

自然對界(natural alignment)即預設對齊方式,是指按結構體的成員中 size 最大的成員對齊。

例如:

struct naturalalign

;在上述結構體中,size 最大的是 short,其長度為 2 位元組,因而結構體中的 char 成員 a、c 都以 2 為單位對齊,sizeof(naturalalign)的結果等於 6;

1.2 指定對界

一般地,可以通過下面的方法來改變預設的對界條件:

如果#pragma pack (n)中指定的 n 大於結構體中最大成員的 size,則其不起作用,結構體仍然按照 size 最大的成員進行對界

例如:

#pragma pack (n)

struct naturalalign

;#pragma pack ()

當 n 為 4、8、16 時,其對齊方式均一樣,sizeof(naturalalign)的結果都等於 12。而當 n 為 2時,其發揮了作用,使得 sizeof(naturalalign)的結果為 8。

__attribute__((aligned (n))),讓所作用的結構成員對齊在n位元組自然邊界上。如果結構中有成員的長度大於n,則按照最大成員的長度來對齊

struct naturalalign

__attribute__((aligned (1)));

sizeof(naturalalign)的結果為20,int為4位元組大於1,按4位元組對齊所以就是4+4+12

__attribute__ ((packed)),取消結構在編譯過程中的優化對齊,按照實際占用位元組數進行對齊

struct naturalalign

__attribute__((packed));

sizeof(naturalalign)的結果為8

struct naturalalign

__attribute__((packed));

sizeof(naturalalign)的結果為5

具體為啥結果是5和8可參考這位博主的解釋:

簡要解釋:

先讓我們看四個重要的基本概念:

有了這些值,我們就可以很方便的來討論具體資料結構的成員和其自身的對齊方式。有效對齊值n是最終用來決定資料存放位址方式的值,最重要。有效對齊n,就是 表示「對齊在n上」,也就是說該資料的"存放起始位址%n=0".而資料結構中的資料變數都是按定義的先後順序來排放的。第乙個資料變數的起始位址就是數 據結構的起始位址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數占用總長度需要是對結構體有效對齊值的整數 倍,結合下面例子理解)。這樣就不難理解上面的幾個例子的值。

在 c++語言中 struct 具有了「類」 的功能,其與關鍵字 class 的區別在於 struct 中成員變數和函式的預設訪問許可權為 public,而 class 的為 private

例如,定義 struct 類和 class 類:

struct structa

class classb

則:structa a;

a.a = 『a』; //訪問 public 成員,合法

classb b;

b.a = 『a』; //訪問 private 成員,不合法

c++中的 struct 保持了對 c 中 struct 的全面相容下面的操作是合法的:

//定義 struct

struct structa

;7structa a = ; // 定義時直接賦初值

即 struct 可以在定義的時候直接以對其成員變數賦初值,而 class 則不能

C C中的小知識備忘

為了避免標頭檔案重複包含,有兩種方式可以選擇,一種是 ifndef方式,由標準支援 一種是 pragma once方式,編譯器提供。方式一 ifndef solveequation h define solveequation h endif solveequation h 方式二 pragma o...

C C 小知識點

在c語言中也有不少比較好用的函式 比如 strchr str,ch 就是在str字串裡面尋找ch第一次出現的位置,有ch返回對應指標,否則返回null 比如想要把乙個字串中的兩個整數轉換成真整數可以這麼幹 char str 123,456 int n1,n2 char temp 10 char p ...

C C 中struct的區別

這裡有兩種情況下的區別。1 c的struct與c 的class的區別。2 c 中的struct和class的區別。在第一種情況下,struct與class有著非常明顯的區別。c是一種過程化的語言,struct只是作為一種複雜資料型別定義,struct中只能定義成員變數,不能定義成員函式 在純粹的c語...