linux系統下struct大小的計算總結

2021-07-03 21:51:51 字數 1747 閱讀 1527

fire今天剛學了結構體,聽的不是很明白,回來之後找了很多資料,然後自己親手證明,總結了結構體大小計算的幾個結論,如果有問題希望大家給予指點:

linux系統 pragma pack 預設為4
結構體對齊模數是結構體內部最大資料成員長度和pragma pack中的較小者

例如:

char a[4];

short c;

double b;

由於結構體中有double型別8個位元組,比linux系統下預設的pragma pack大,所以我們的對齊模數為4;

公式: len = type > foctor ? focus : type

len 結構體對齊模數長度

type 結構體成員型別最大長度

foctor 對齊因子大小(linux預設4,也就是我們的pragma pack的大小)

####以上都是fire自己取的名字,為了形象、好記

那麼下來我就說說我總結的三條規則吧:

1:資料成員對齊規則:

結構體的第乙個資料成員要放在offset為0的位址,以後每個資料成員儲存的起始位置都要從該成員大小或者成員的子成員大小(比如陣列,結構體等都有子成員)的整數倍開始存放。如果成員大小大於對齊模數,則要按照對齊模數的整數倍開始存放

例如1:

char a; 

short c;

double b;

對齊因子為4,char存放在0位置;short存放在2-3,由於double型別大於4,所以還是按照4-11存放,而不是8-15,所以為2+2+8=12;

例如2:

int a;

double b;

float c;

總長度為4+8+4=16;

例如:結構體a中有結構體b成員。b中友有char,int,double等元素,則b成員應該從8的整數倍開始存放。
最後補齊的原則

3:最終,結構體的長度為對齊模數的整數倍

當對最後乙個成員需要補齊的話      

例如1:

int a;

short c[5];

char b;

根據1,對齊模數為4,所以int在記憶體中是從0-3;short是從4-13;而char型別本來是乙個位元組,但是我們要補齊為4的整數倍。所以char是從13-15,加起來4+10+2=16;16為4的整數倍,所以符合我們的規則。

例如2:

double b;

char a;

由於8大於對齊因子4,所以,我們就取對齊模數為4,所以double為0-7;char為8-11;所以8+4=12;

總結,以上兩個雖然對齊因子都是4,但是,對於char來說位置都在最後乙個,但是他們乙個補齊為2,乙個補齊為4,原因就是我們所說的一句話,

最終,結構體的長度為對齊模數的整數倍

空結構體大小

在c語言中空結構體大小為 0;
改變pragma pack的大小:

#pragma pack(2)

#pragma pack(0)

以上表示把pragma pack大小改為2;

linux下的struct運用

一.struct 與 typedef struct的區別 typedef是c語言的關鍵字,作用在於為一種資料定義乙個新名字。資料型別包括內部資料型別 int,char等 和自定義的資料型別 struct型別等 使結構體使用更加方便。1.typedef定義時,宣告變數可直接用 goio stu stu...

Linux系統下TCP keepalive屬性檢視

會員收藏 遊客收藏 大中小 tcp是面向連線的,在實際應用中通常都需要檢測連線是否還可用.如果不可用,可分為 a.連線的對端正常關閉.b.連線的對端非正常關閉,這包括對端裝置掉電,程式崩潰,網路被中斷等.這種情況是不能也無法通知對端的,所以連線會一直存在,浪費國家的資源.tcp協議棧有個keepal...

雙系統下解除安裝linux系統

雙系統 win10 centos6.8 目的 電腦加裝硬碟後,想把centos安裝到新的磁碟上,第一步,先解除安裝原有centos。注意 雙系統都知道,先按windows,再安裝linux,windows是通過linux系統下的啟動引導檔案引導的,若解除安裝linux,windows自然無法啟動,這...