C 如何獲取類成員的偏移

2021-07-25 16:18:43 字數 483 閱讀 6024

如何獲取類成員變數的移植,網上有個方法:

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 ...