位元組對齊詳細講解
1、我們的結構體變數本身就是在4位元組對齊的位置,編譯器幫我們做的事。
2、第乙個成員,就從結構體開始的位址處,存放。這個元素,具體佔多少位元組,由緊挨著下個元素決定。
3、整個成員變數自身都對齊 了,還沒有結束。
4、整個結構體還要是預設位元組對齊的最小整數倍。
結構體預設的位元組對齊:成員變數最大的那個型別所佔位元組
64位機下在設定對齊時會將結構體最大的元素與8位元組比較,取其小
例如在如下例子中
最大的成員是a(4位元組)<8位元組
所以以4位元組對齊
typedef
struct data
d;//8位元組
下例中最大成員是b(8位元組)
根據上面的說法 以8位元組對齊
struct data1
d;//16位元組
位元組對齊命令
#pragma pack(n) (1、2、4、8、…..)
…… #pragma pack()
這兩個配合使用,表示乙個區間,只有這個區間內的結構體享受這個待遇。
設定 對齊。
設定為1,就是不對齊
1、充分利用記憶體空間,犧牲了速度,降低了訪問效率。
2、提高效率、效能,犧牲了記憶體空間。
總結:你指定的對齊方式和結構體自身預設對齊方式,倆者取最小的。
用法舉例:
下例的意思是以2位元組對齊
所以是s1結果是14
s1是2
#pragma pack(2)
struct data
s;struct data1
s1;#pragma pack()
位欄位
位欄位:專用於結構體,結構體成員的型別必須是:int || unsigned int
有時侯,結構體成員表示的資料很小,就用幾個位來表示。
下例1
a佔32位中的1bit
b佔2bit
c佔2bit
後面全部填充
struct data //4
s, *p = &s;
例子2
struct data2 //12
s2;
例子3
struct data3 //8
s3;
linux核心裡的兩個巨集:在驅動應用中很廣泛。
1, off_set_of(type, member)計算結構體內元素的偏移量
2, containe_of(ptr, type, member),ptr是結構體裡成員的指標,通過呼叫這個巨集計算出結構體的首位址.包含兩句**(表示式),必須要加{}.
這兩個巨集:核心雙鏈表。
#define off_set_of(type, member) ((long)&(((type *)0)->member))
#define container_of(ptr, type, member) ()
分析:1、(type *)0指向結構體零位址 \
2、((type *)0)->member得到了結構體某個成元變數名 \
3、給這成員變數名,取位址(相對於零位址),此時&(((type *)0)->member)表示是指標型別 \
4、強制型別轉換成long。
struct da
; // 16
struct data
s = ;
int main(void)
struct data *p = container_of(p_e, struct data, e);
得到成員e的結構體首位址
列舉型別以及簡單密碼鎖的編寫
typedef enum
state
s;
如果
typedef
enum fangxiang // 識別符號
e;
在這裡sauth==100;
north==100;
簡單密碼鎖例項**
int main(void)
if (current_state == state5)
if (current_state == state1)
printf("初始狀態.\n");
}return
0;}
網路結構體ipv4
struct in_addr
;/* structure describing an internet socket address. */
struct sockaddr_in
;
標頭檔案:
#include
#include
#include
#include
#include
#include
#include
型別定義/巨集定義
typedef uint32_t in_addr_t;
typedef uint16_t in_port_t;
#define port 0x1234
#define addr "192.168.1.22"
給每個成員賦值
void set_net_struct(struct sockaddr_in *p)
柔性陣列
柔性陣列:是在結構體裡,有乙個陣列,必須是結構體最後的乙個元素,而且由特定形式或[0];
整體的結構體至少有兩個成員變數。
typedef
struct
s;
//生成柔性陣列
void create_soft_arr(int len)
//看一下 用func
free(p);
}
結構體函式
typedef
int (*p_func)(int a, int b);
int add(int a, int b)
int mul_a_b(int a, int b)
//結構體各成員預設是public
//class在c++裡,是乙個類,所有成員和方法(函式)是si(private)有的,只能在類裡進行訪問
//struct裡面不能包含函式,但是可以包含函式指標
struct data
s;//填充結構體
void set_func(struct data *p)
//業務函式
int cnt_func(struct data *p_str)
課堂筆記5
1 語句 語句是完成某種特定任務的 要以英文的分號 結束 語句在定義的時候可以出現在一行中,也可以一行出現多條語句 表示式可以單獨出現在js 中,但是沒有任何意思 2 變數 變數是對 值 的引用。在其他的場合中,有時候把引用也成為位址或指標 在js中,定義變數用 var 關鍵字 var可以不出現變數...
課堂總結2
2019.09.06 上午主要是講了盒模型和display,點了一下float 盒模型主要講了border,margin 外邊距 盒子之間的距離 padding 內邊距 盒子邊緣與內容之間的距離 的使用,和在程式設計時的注意事項,和如何使用和調整,以及調整的技巧 其中需要注意的是 padding 1...
JAVA溫習課堂5
28 static 關鍵字 靜態的 非物件導向的 乙個類的多個物件共享乙個變數,需要用static修飾該變數 因為static修飾的變數為類的所有例項共享,所以static成員不屬於某個類的例項,而屬於整個類 所以在訪問允許的情況下,可以使用 類名.直接訪問靜態成員 成員包括屬性和方法 static...