offsetof巨集定義:
// 獲得結構體(type)的變數成員(member)在此結構體中的偏移量。
#define offsetof(type, member) ((size_t) &((type *)0)->member)
說明:獲得結構體(type)的變數成員(member)在此結構體中的偏移量。
1.( (type *)0 ) 將零轉型為type型別指標,即type型別的指標的位址是0。
2.((type *)0)->member 訪問結構中的資料成員。
3.&( ( (type *)0 )->member ) 取出資料成員的位址。由於type的位址是0,這裡獲取到的位址就是相對member在type中的偏移。
4.(size_t)(&(((type*)0)->member)) 結果轉換型別。對於32位系統而言,size_t是unsigned int型別;對於64位系統而言,size_t是unsigned long型別。
使用示例:
struct student
;int _tmain(int argc, _tchar* ar**)
//結果:
/*gender_offset = 0
id_offset = 4 //位元組對其
type是結構體,它代表"整體";而member是成員,它是整體中的某一部分。
container_of巨集定義:
#define container_of(ptr, type, member) ()
說明:根據"結構體(type)變數"中的"域成員變數(member)的指標(ptr)"來獲取指向整個結構體變數的指標。
1. typeof( ( (type *)0)->member ) 取出member成員的變數型別。
2.const typeof( ((type *)0)->member ) *__mptr = (ptr) 定義變數__mptr指標,並將ptr賦值給__mptr。經過這一步,__mptr為member資料型別的常量指標,其指向ptr所指向的位址。
3. (char *)__mptr 將__mptr轉換為位元組型指標。
4. offsetof(type,member)) 就是獲取"member成員"在"結構體type"中的位置偏移。
5. (char *)__mptr - offsetof(type,member)) 就是用來獲取"結構體type"的指標的起始位址(為char *型指標)。
6.(type *)( (char *)__mptr - offsetof(type,member) ) 就是將"char *型別的結構體type的指標"轉換為"type *型別的結構體type的指標"。
7.反斜槓「/」表示行連線
linux下安裝cmake的兩個方法
inux下安裝軟體的原始碼包很多都需要使用cmake進行編譯,因此需要我們先給linux系統安裝cmake 你或許聽過好幾種 make 工具,例如 gnu make qt 的 qmake 微軟的 ms nmake,bsd make pmake makepp,等等。這些 make 工具遵循著不同的規範...
計算網格的兩個定義
科學領域驅使網格構建的源動力是在不同機構間協作的需求 聚集計算資源充分利用閒置的處理器週期的契機 資料量和計算需求超出了現有巨型計算機處理能力。因此計算網格最基本的定義為 在多種體系的動態環境下協作資源共享以及解決同樣問題。如果您把網際網路看作通訊網路,那麼網格計算就是計算網路 用於合用資產之間協調...
兩個lock的經典使用示例
示例一 public class numberprintdemo catch interruptedexception e 當state 1時,輪到執行緒1列印5次數字 for int j 0 j 5 j system.out.println 執行緒1列印完成後,將state賦值為2,表示接下來將輪...