<nav id="gb9pn"></nav>

  1. <form id="gb9pn"><legend id="gb9pn"></legend></form>

    <form id="gb9pn"><legend id="gb9pn"><video id="gb9pn"></video></legend></form>
  2. Hi£¬»¶Ó­À´µ½Ç¶ÈëʽÅàѵ¸ß¶ËÆ·ÅÆ - »ªÇåÔ¶¼û½ÌÓý¼¯ÍÅ<±±¾©×ܲ¿¹ÙÍø>£¬×¨×¢Ç¶Èëʽ¹¤³ÌʦÅàÑø15Ä꣡
    µ±Ç°Î»ÖÃ: > »ªÇåÔ¶¼û½ÌÓý¼¯ÍÅ > ǶÈëʽѧϰ > ½²Ê¦²©ÎÄ > ½Ò¿ªlinuxÄÚºËÖÐcontainer_ofµÄÉñÃØÃæÉ´
    ½Ò¿ªlinuxÄÚºËÖÐcontainer_ofµÄÉñÃØÃæÉ´
    ʱ¼ä£º2016-12-22×÷Õߣº»ªÇåÔ¶¼û

    ÔÚlinux ÄÚºËÖÐÓÐÒ»¸ö´óÃû¶¦¶¦µÄºêcontainer_of()£¬Õâ¸öºêÊÇÓÃÀ´¸ÉÂïµÄÄØ£¿ÎÒÃÇÏÈÀ´¿´¿´ËüÔÚÄÚºËÖÐÊÇÔõÑù¶¨ÒåµÄ¡£

    ºÇºÇ£¬Õ§Ò»¿´²»ÖªµÀÊÇʲô¶«¶«¡£

    ÎÒÃÇÏÈÀ´·ÖÎöÒ»ÏÂcontainer_of(ptr,type,member),ÕâÀïÃæÓÐptr,type,member·Ö±ð´ú±íÖ¸Õë¡¢ÀàÐÍ¡¢³ÉÔ±¡£¿´Ò»¸öÀý×Ó:

    Struct test
            {
                    int i;
                    int j;
                    char k;
            };
            Struct test temp;

    ÏÖÔÚÄØÈç¹ûÎÒÏëͨ¹ý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Á˽â·Ç³£¶àµÄÅ£ÈË£¬»¹Óкܳ¤Ò»¶Î·¡£

    ·¢±íÆÀÂÛ
    ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
    welcome¹º²ÊÖÐÐÄ