1、windows平台下有offsetof巨集可以求得結構體成員變數便宜,原始碼如下:
example 1.2 鍊錶定義/* define offsetof macro */
#ifdef __cplusplus
#ifdef _win64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast((((s *)0)->m)) )
#else
#define offsetof(s,m) (size_t)&reinterpret_cast((((s *)0)->m))
#endif
#else
#ifdef _win64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m) (size_t)&(((s *)0)->m)//零位址得出的偏移,相當null指標,->符號並沒有去執行**,編譯器只是取成員域的位址,避免物件建立,效率大大提高,往往在面試題中出現
#endif
#endif /* __cplusplus */
windows下有個containing_record
#define containing_record(address,type,field) ((type*)((pchar)(address)-(ulong_ptr)(&((type*)0)->field)))
3、linux的鍊錶和hash表就用到了這種技術
在linux核心中,鍊錶沒有儲存資料域,鍊錶節點作為資料節點的域,遍歷全域性鍊錶或者hash表時,利用上面1、2兩點得資料節點的位址。跟一般的鍊錶操作相反。
example 1.1 資料節點結構體
749struct inode ;
782 dev_t i_rdev;
783 struct timespec i_atime;
784 struct timespec i_mtime;
785 struct timespec i_ctime;
786 spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
787 unsigned short i_bytes;
788 blkcnt_t i_blocks;
789 loff_t i_size;
790791#ifdef __need_i_size_ordered
792 seqcount_t i_size_seqcount;
793#endif
794795 /* misc */
796 unsigned long i_state;
797 struct mutex i_mutex;
798799 unsigned long dirtied_when; /* jiffies of first dirtying */
800801 struct hlist_node i_hash; //hash鍊錶
802 struct list_head i_wb_list; /* backing dev io list */
803 struct list_head i_lru; /* inode lru list */
804 struct list_head i_sb_list;
805 union ;
809 atomic_t i_count;
810 unsigned int i_blkbits;
811 u64 i_version;
812 atomic_t i_dio_count;
813 atomic_t i_writecount;
814 const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
815 struct file_lock *i_flock;
816 struct address_space i_data;
817#ifdef config_quota
818 struct dquot *i_dquot[maxquotas];
819#endif
820 struct list_head i_devices;
821 union ;
826827 __u32 i_generation;
828829#ifdef config_fsnotify
830 __u32 i_fsnotify_mask; /* all events this inode cares about */
831 struct hlist_head i_fsnotify_marks;
832#endif
833834#ifdef config_ima
835 atomic_t i_readcount; /* struct files open ro */
836#endif
837 void *i_private; /* fs or device private pointer */
838};
struct list_head ;
225226 struct hlist_head ;
229230 struct hlist_node ;
結構體成員變數偏移量
我們先來定義一下需求 已知結構體型別定義如下 struct node t 且結構體1byte對齊 pragma pack 1 求 結構體struct node t中成員變數c的偏移。注 這裡的偏移量指的是相對於結構體起始位置的偏移量。有三種方法 1.使用巨集offsetof 2.定義乙個結構體,用結...
獲取結構體某成員偏移
本身這個問題非常簡單,直接用位址差值即可求得,最近在某本書上看到了乙個非常牛的方法,第一次看還將信將疑覺得不太可能,後面上機驗證發現確實可以,如下 1 include iostream 23 using namespace std 45 6struct test7 1314 define find ...
c語言 得到結構體成員偏移
struct stru printf offset of stru.i ld n size t char s.i char s printf struct stru 0 i ld n size t struct stru 0 i 標準庫中定義了函式offsetof type,member 直接使用即...