這本來是上學期c++課的課程實驗,一直都忘記把它寫下來。
當時的實驗要求是用函式模板建立乙個函式可以對輸入的結構體的任一成員進行函式體的排序。我本身c++學的也比較水,本來說既然確定了結構用個引數把需要進行排序的那一項傳進去做個判斷,乙個成員寫一串**也可以,不過這裡正好涉及到了以前學c時一直比較困惑的問題就是怎麼對結構體進行動態操作,所以就稍微查了一下。
當時在網上google了一下,沒有找到什麼期望中的結果,最後還是在cfaqs裡面翻出來了乙個偏移量的概念。發現確實是我想要的東西。
在cstddef這個標頭檔案裡本身就有乙個offsetof巨集可以給我們呼叫,當然也可以自己定義。這個是cfaqs給出的**:
#define offsetof(type, f) ((size_t)((char *)&((type *)0)->f - (char *)(type *)0))
這段**本身是先建立乙個type型的0指標(當時正還在這裡學習了一下null和0的關係,不過很久不用也基本忘了==b。當時感覺0指標明明不能使用但是卻可以分給結構成員空間計算出記憶體偏移長度特別神奇),然後再指向成員f的記憶體位址,將f的位址與0指標強制轉成char型然後相減就得出來了成員f到結構體頭一位記憶體位址的偏移量,將計算出來的偏移量加到需要操作的結構體的指標上就可以直接得到結構成員的指標。
當時就是從這行**裡我才發現自己一直對巨集定義的理解有問題,在我以前的認識裡帶參巨集和函式是十分相似的,->f這種情況應該會建立個區域性變數把f值傳進來,然後對於乙個形參而言這種操作肯定是錯誤的,不過現在才明白這種帶參巨集的處理看上去就像是字串的複製貼上一樣,比想象中強大得多。
在呼叫原裝的offsetof的時候需要注意乙個問題,就是結構體中的資料必須是pod型,也就是最早在c語言中定義的定長的資料型別。因為對特定的結構體計算出的長度是固定不變的,如果結構中含有變長的資料就會出現指標錯位的情況。按照從網上看到的說法,含有類的結構體是不能計算偏移量的,不過實際使用中在結構中雖然含有string型的成員會有警告,但是實際執行的程式卻沒有錯誤,估計是因為在結構體中儲存的只是string類的指標。
順道把當時寫的可以對鍊錶進行基於任意成員排序的函式模板貼上來
templateint insertsort(struct head,element type,int offset)
ptmp = head->next;
head->next = null;
p = head;
while(ptmp)
p = p->next;
}tmp = ptmp;
ptmp = ptmp->next;
tmp->next = p->next;
p->next = tmp;
p = head;
} return 0;
}
C C 結構體成員偏移量獲取
分析 節選自muduo.以下 通過offsetof獲取sin family在sockaddr in6中的字段偏移量.static assert offsetof sockaddr in6,sin6 family 0,sin6 family offset 0 需要注意 offsetof並非c c 標準...
檔案指標偏移量
f.seek offset,whence offset代表檔案的指標的偏移量,單位是位元組bytes whence代表參考物,有三個取值 0 參照檔案的開頭 1 參照當前檔案指標所在位置 2 參照檔案末尾 ps 快速移動到檔案末尾f.seek 0,2 強調 其中whence 1和whence 2只能...
c point偏移 c 偏移量分頁效果
分頁效果對程式設計師來所是常見的,但是在這裡我介紹的是乙個不一樣的分頁效果,也許你們也長用,偏移量的分頁效果,以前學的不精所以研究一好久覺得還是拿出來分享一下吧,同時也讓我記住。好了光說大家可定沒興趣,來個效果圖吧 這個效果想必大家不陌生吧。先介紹一下偏移量的思路吧,也方便我以後好記起,呵呵私心哈,...