巧妙獲取結構體大小

在/sys/un.h中有這麼一個宏:

#define SUN_LEN(ptr) ((size_t)(((struct sockaddr_un *)0->sun_path) + strlen((ptr)->sun_path))

這個宏的巧妙之處是在不需要分配內存的情況下可以獲取結構各個部分(除了最後一個)的大小

如:

struct a{
    int b;
    int c;
    int d;
}a;

int size_of_b = &(((struct a*) 0)->c);

這裏利用了結構體的內存分配模型來達到效果,在結構體中相鄰結構的內存一般是相鄰分配的,所以int c開始的地址就是b結尾的地址,用c開始的地址減去結構體a的起始地址就是b的大小,那麼如果需要c的大小怎麼辦呢?可以這樣做:

int size_of_c = &(((struct a*)0)->c) - &(((struct a*)0)->d)

如此類推便可算出任意一部分的長度,除了最後一部分外。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章