結構體成員變數的偏移值

2021-06-03 01:14:23 字數 3343 閱讀 2981

1、windows平台下有offsetof巨集可以求得結構體成員變數便宜,原始碼如下:

/* 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};

example 1.2 鍊錶定義

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 直接使用即...