如何獲取類成員變數的移植,網上有個方法:
struct a ;
&((a*)0)->i;
原理如下:
&((a*)0)的位址是0,所以&((a*)0)->i的位址為&((a*)0)->i減去0,即成員變數的位址。
之所以可以這樣,是因為沒有記憶體的分配讀寫,這段**的計算在編譯時就完成,只要編譯不出錯就可以。
最近檢視android的art runtime**,發現有類似的巨集定義:
#define offsetof_member(t, f) \
(reinterpret_cast(&reinterpret_cast(16)->f) - static_cast(16u)) // nolint
實際上就是上面的方法,把0換成了16
為什麼要用16呢?因為如果用0,lint會提示錯誤。
為什麼不用1或其它?因為有類/結構體對齊問題。
如何獲取結構體某成員的偏移位址
我們假設結構體定義如下所示 cpp view plain copy print?include include struct test s 思路1 非常簡單,直接用位址差值即可求得。cpp view plain copy print?intmain intargc,char argv 思路2 考慮巨...
C 成員在類中的偏移量 類成員指標
首先來看一道程式設計題 寫出輸出的結果 include class a a void fun private int m a int m b class b b void fun private int m c void main 程式的輸出結果為1 這裡主要涉及兩個方面 1 物件呼叫成員函式的時候...
獲取結構體某成員偏移
本身這個問題非常簡單,直接用位址差值即可求得,最近在某本書上看到了乙個非常牛的方法,第一次看還將信將疑覺得不太可能,後面上機驗證發現確實可以,如下 1 include iostream 23 using namespace std 45 6struct test7 1314 define find ...