½Ò¿ªlinuxÄÚºËÖÐcontainer_ofµÄÉñÃØÃæÉ´
ʱ¼ä£º2016-12-22×÷Õߣº»ªÇåÔ¶¼û
ÔÚlinux ÄÚºËÖÐÓÐÒ»¸ö´óÃû¶¦¶¦µÄºêcontainer_of()£¬Õâ¸öºêÊÇÓÃÀ´¸ÉÂïµÄÄØ£¿ÎÒÃÇÏÈÀ´¿´¿´ËüÔÚÄÚºËÖÐÊÇÔõÑù¶¨ÒåµÄ¡£
ºÇºÇ£¬Õ§Ò»¿´²»ÖªµÀÊÇʲô¶«¶«¡£ ÎÒÃÇÏÈÀ´·ÖÎöÒ»ÏÂcontainer_of(ptr,type,member),ÕâÀïÃæÓÐptr,type,member·Ö±ð´ú±íÖ¸Õë¡¢ÀàÐÍ¡¢³ÉÔ±¡£¿´Ò»¸öÀý×Ó:
Struct test ÏÖÔÚÄØÈç¹ûÎÒÏëͨ¹ýtemp.jµÄµØÖ·ÕÒµ½tempµÄÊ×µØÖ·¾Í¿ÉÒÔʹÓÃcontainer_of(&temp.j,struct test,j); ÏÖÔÚÎÒÃÇÖªµÀcontainer_of()µÄ×÷ÓþÍÊÇͨ¹ýÒ»¸ö½á¹¹±äÁ¿ÖÐÒ»¸ö³ÉÔ±µÄµØÖ·ÕÒµ½Õâ¸ö½á¹¹Ìå±äÁ¿µÄÊ×µØÖ·¡£ ÏÂÃæÀ´¿´¿´±È½Ï¸´ÔÓµÄÄÚÈÝ:
ÎÒÃÇÓÃÉÏÃæµÄstruct testÕÅչһϠConst typeof(((struct test *)0)->j) * __mptr = (&temp.j); ÆäÖУ¬typeofÊÇGNU C¶Ô±ê×¼CµÄÀ©Õ¹£¬ËüµÄ×÷ÓÃÊǸù¾Ý±äÁ¿»ñÈ¡±äÁ¿µÄÀàÐÍ¡£Òò´Ë£¬ÉÏÊö´úÂëµÄ×÷ÓÃÊÇÊ×ÏÈʹÓÃtypeof»ñÈ¡½á¹¹Ìå³ÉÔ±jµÄÀàÐÍΪint,È»ºó¶¥Ò»¸öintÖ¸ÕëÀàÐ͵ÄÁÙʱ±äÁ¿__mptr,²¢½«½á¹¹Ìå±äÁ¿ÖеijÉÔ±µÄµØÖ·¸³¸øÁÙʱ±äÁ¿__mptr¡£ (struct test *)((char *)__mptr - offsetof(struct test,j)); ½Ó×ÅÎÒÃÇÀ´¿´Ò»ÏÂoffsetof(struct test,j)£¬ËûÔÚÄÚºËÖÐÈç϶¨Òå
Õ¹¿ª(size_t)&((struct test *)0)->j,ÕâÊÇʲô¶«¶«£¿ Ò»¿ªÊ¼Ò²²»Ã÷°×£¬ÕâÀïÒª¸Ðл²ÜÀÏʦÀÏʦµÄÈÈÐİïÖú£¬Ò»ÓᆰÐÑÃÎÖÐÈË,ºÇºÇ£¬¿ÉÒÔÊÇÕâÑùÀí½â¡£
ÆäÖÐsize_tÊÇÕûÐÍ,ÄÇôÎÒÃÇ¿ÉÒÔÖªµÀÖյĽá¹ûÊÇÒ»¸öÕûÐÎÖµ£¬Ò²¾ÍÊÇjÏà¶ÔÓÚ0µØÖ·µÄÆ«ÒÆÁ¿¡£Ò²ÐíÏÖÔÚÄã»áÎÊ£¬Õû³öÕâô¸öÍæÒâ¸ÉÂÏÂÃæ¿´¸öÁÐ×Ó:
³ÌÐòÔËÐнá¹û:
·¢ÏÖûÓÐÈç¹û°ÑµÚ¶þ¸öÖµ ¼õÈ¥ºóÒ»¸öÖµ£¬¾ÍÄܵõ½µÚÒ»¸öÖµ¡£ ÔÚ»ØÊ×Ò»ÏÂËü: (struct test *)((char *)__mptr - offsetof(struct test,j)); ÊDz»ÊÇ¿ÉÒÔ»ñµÃ½á¹¹Ìå±äÁ¿tempµÄÊ×µØÖ·Ñ½£¬ÊDz»ÊÇÌ«¾«ÃîÁËѽ£¬linuxÄÚºËÖÐËæËæ±ã±ãÒ»¸öºê¾ÍÓÐÈç´Ë¾«ÃºÇºÇ£¬ÏëÏë¶ÔlinuxÁ˽â·Ç³£¶àµÄÅ£ÈË£¬»¹Óкܳ¤Ò»¶Î·¡£
Ïà¹Ø×ÊѶ
·¢±íÆÀÂÛ
|