知識點:
>結構體型別建立
>結構體初始化
>結構體內存對齊
>位段,位段計算機大小
>列舉+聯合
1.結構體的宣告
結構體的基礎知識:結構是一些值的集合,這些值成為成員變數。結構的每乙個成員可以是不同的變數。
例如描述乙個學生:
struct str;
特殊的宣告:在宣告結構的時候,可以不完全宣告。
比如:
//匿名結構體型別
structx;//x表示變數
structa[20], *p;
結構體變數的定義和初始化:
struct pointp1; //宣告型別的同時定義變數p1
struct point p2; //定義結構體變數p2
//初始化:定義變數的同時賦初值。
struct point p3 = ;
struct stu;
struct stu s = ;//初始化
struct node
n1 = , null }; //結構體巢狀初始化
struct node n2 = , null }; //結構體巢狀初始化
結構體內存對齊:計算結構體的大小
首先的掌握結構體的對齊規則:
1. 第乙個成員在與結構體變數偏移量為0的位址處。
2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
對齊數= 編譯器預設的乙個對齊數 與 該成員大小的較小值。 vs中預設的值為8。
linux中的預設值為4。
3. 結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數
(含巢狀結構體的對齊數)的整數倍。
記憶體對齊:
1. 平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則跑出硬體異常。
2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界對齊。原因在於,為了訪問對齊的記憶體,處理器需要做兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
總體來說:
結構體的記憶體對齊就是拿空間來換時間的做法。
//例如:
struct s1;
struct s2;
後續接著。bye~
染小熙要去喂貓啦~
C語言結構體內存對齊
1.效能原因 為了提高cup的效率訪問記憶體的速度,若是訪問未對齊的記憶體,處理器需要作兩次訪問 而訪問對齊的記憶體,則只需要一次訪問。2.編譯器相關 有的編譯器已經優化了記憶體對齊,所以記憶體對齊依賴於編譯器。參考 結構體對齊問題 說實話,規則看起來不太好理解,直接模仿下面步驟即可 以32位機器為...
C語言結構體內存對齊
記憶體中存放資料的時候要有一定的規則,這麼做得根本原因是要減少cpu訪問記憶體的次數。舉個例子,int型別為4個位元組,存放int型別的記憶體的起始位址就是4的倍數,這樣cpu訪問一次記憶體就能夠取到資料 跟cpu訪問記憶體的機制有關,加上cache的對映,一般cpu一次訪問64位元組的資料,也有1...
C語言 結構體內存對齊
1 平台原因 不是所有硬體平台都能夠訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 主要原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問...