·¢²©ÎÄ
linux kernel ×ÔÓɲ©¿Í

http://blog.chinaunix.net/space.php?uid=10678279

   
¸öÈË×ÊÁÏ
  • ²©¿Í·ÃÎÊ£º991274
  • ²©ÎÄÊýÁ¿£º216
  • ²©¿Í»ý·Ö£º10045
  • ²©¿ÍµÈ¼¶£ºÉϽ«
  • ×¢²áʱ¼ä£º2006-08-07 12:36:48
¶©ÔÄÎҵIJ©¿Í
  • ¶©ÔÄ
  • ¶©Ôĵ½Ïʹû
  • ¶©Ôĵ½×¥Ïº
  • ¶©Ôĵ½Google
×ÖÌå´óС£º´ó ÖРС²©ÎÄ
·ÖÀࣺ һЩÑо¿

ÎÒ°ÑÎÒ¹«Ë¾ÄÚµÄbbsÉÏÃæÌÖÂÛµÄÒ»¸öÌû×Ó¾­¹ýÕûÀíºó £¬ÌúµÀÕâÀïÁË¡£
 
¶ÔÆë£¬¡¡¶ÔÓÚ£ð£ï£ò£ô£é£î£ç¡¡¹¤×÷À´ËµÊµÔÚÊÇÌ«ÖØÒªÁË£¬
ÎÒ¾õµÃ£¬£ð£ï£ò£ô£é£î£çµÄÎÊÌâÖ÷ÒªÓÐÈý¸ö´ó¿é£º
£±£¾£å£î£ä£é£á£îÎÊÌâ
£²¡µ¶ÔÆëÎÊÌâ
£³¡µÖ§³Ö¹ú¼Ê»¯µÄÎÊÌ⣨Ҳ¾ÍÊÇÄÜ·ñÖ§³Ö¸÷ÖÖ¹ú¼ÒÎÄ×Ö£¬»òÕß˵£é£±£¸£î£©

¶ÔÆëÎÊÌâ²Î¿¼£º
http://www.yuanma.org/data/2006/0723/article_1213.htm

˵µÄ̫͸³¹ÁË¡£¡¡

µ«ÊÇ £¬ ÀïÃæÓÐÒ»¾ä»°Ëµ´íÁË£¬ »òÕß²»¶Ô£¬
¾ÍÊÇ£º
4.Êý¾Ý³ÉÔ±¡¢½á¹¹ÌåºÍÀàµÄÓÐЧ¶ÔÆëÖµ£º×ÔÉí¶ÔÆëÖµºÍÖ¸¶¨¶ÔÆëÖµÖÐСµÄÄǸöÖµ
Çë¿´ÎÒºóÃæµÄÌÖÂÛ£¬Ï£Íû¶Ô´ó¼ÒÓÐËù°ïÖú¡£
 
£­£­£­£­£­£­£­£­£­£­£­
 
Ìû2£º
ÕâÀïÃæ¼ÈÓÐ¶ÔÆëÉϵIJî±ð£¬ÓÖÓÐendianÉϵIJî±ð

#include <stdio.h>
#include <stdlib.h>

struct zlb {
        char a;
        int b;
        short c;
}__attribute__((__packed__));
int main(void)
{
        int a=0x12345678;
        char *p = (char *)&a;
        short *pshort = (short *)(p+1);
        short p2_short = 0;

        printf("*p=%#x\n",*p);
        printf("*(p+3)=%#x\n",*(p+3));
        printf("*pshort=%#x\n",*pshort);

        *pshort = 0xaabb;
        printf("modified \n");
        printf("*pshort=%#hx\n",*pshort);

        printf("a=%#x\n",a);
        printf("zlb size =%d\n",sizeof(struct zlb));

        return 0;
}

ÔÚpc x86ÉϵÄÔËÐнá¹û£º
*p=0x78
*(p+3)=0x12
*pshort=0x3456
modified
*pshort=0xaabb
a=0x12aabb78
zlb size =7

£­£­£­£­£­£­£­£­£­£­£­£­£­£­£­£­£­£­
ÔÚARMÉϵÄÔËÐнá¹û£¨Xscale ixp425 £¬ big-endian)
#
# ./test
*p=0x12
*(p+3)=0x78
*pshort=0x1234 //×¢ÒâÕâÀïµÄÇø±ð£¬ÕâÀïÊǹؼü£¬
modified
*pshort=0xaabb
a=0xaabb5678
zlb size =7

£­£­£­£­£­

Ìû3£º

struct zlb {
char a;
int b;
short c;
}__attribute__((__packed__));

ÔÚÒÆÖ²ÉÏÃæÊDz»ºÃµÄ£¬Ò²¾ÍÊÇ__packed__×îºÃ²»ÒªÓᣡ¡Èç¹ûÒªÓã¬Ò²ÒªÈËΪÌî³ä£º

struct zlb {
        char a;
        char __pad1[3];
        int b;
        short c;
        char __pad2[2];
}__attribute__((__packed__));

ÕâÑùÊDZȽϺÏÀíµÄ¡£¡¡¡¡¿Õ¼ä»»Ê±¼ä£¬ÃâµÃ±àÒëÆ÷ÊÜÀÛ¡£

 

£­£­£­£­£­£­£­£­£­£­

Ìû4£º

from : http://www.yuanma.org/data/2006/0723/article_1213.htm
ÏÈÈÃÎÒÃÇ¿´ËĸöÖØÒªµÄ»ù±¾¸ÅÄ
1.Êý¾ÝÀàÐÍ×ÔÉíµÄ¶ÔÆëÖµ£º
¶ÔÓÚcharÐÍÊý¾Ý£¬Æä×ÔÉí¶ÔÆëֵΪ1£¬¶ÔÓÚshortÐÍΪ2£¬¶ÔÓÚint,float,doubleÀàÐÍ£¬Æä×ÔÉí¶ÔÆëֵΪ4£¬µ¥Î»×Ö½Ú¡£
2.½á¹¹Ìå»òÕßÀàµÄ×ÔÉí¶ÔÆëÖµ£ºÆä³ÉÔ±ÖÐ×ÔÉí¶ÔÆëÖµ×î´óµÄÄǸöÖµ¡£
3.Ö¸¶¨¶ÔÆëÖµ£º#pragma pack (value)ʱµÄÖ¸¶¨¶ÔÆëÖµvalue¡£
4.Êý¾Ý³ÉÔ±¡¢½á¹¹ÌåºÍÀàµÄÓÐЧ¶ÔÆëÖµ£º×ÔÉí¶ÔÆëÖµºÍÖ¸¶¨¶ÔÆëÖµÖÐСµÄÄǸöÖµ¡£
ÓÐ ÁËÕâЩֵ£¬ÎÒÃǾͿÉÒԺܷ½±ãµÄÀ´ÌÖÂÛ¾ßÌåÊý¾Ý½á¹¹µÄ³ÉÔ±ºÍÆä×ÔÉíµÄ¶ÔÆë·½Ê½¡£ÓÐЧ¶ÔÆëÖµNÊÇ×îÖÕÓÃÀ´¾ö¶¨Êý¾Ý´æ·ÅµØÖ··½Ê½µÄÖµ£¬×îÖØÒª¡£ÓÐЧ¶ÔÆëN£¬¾ÍÊÇ ±íʾ¡°¶ÔÆëÔÚNÉÏ¡±£¬Ò²¾ÍÊÇ˵¸ÃÊý¾ÝµÄ"´æ·ÅÆðʼµØÖ·%N=0".¶øÊý¾Ý½á¹¹ÖеÄÊý¾Ý±äÁ¿¶¼Êǰ´¶¨ÒåµÄÏȺó˳ÐòÀ´Åŷŵġ£µÚÒ»¸öÊý¾Ý±äÁ¿µÄÆðʼµØÖ·¾ÍÊÇÊý ¾Ý½á¹¹µÄÆðʼµØÖ·¡£½á¹¹ÌåµÄ³ÉÔ±±äÁ¿Òª¶ÔÆëÅÅ·Å£¬½á¹¹Ìå±¾ÉíÒ²Òª¸ù¾Ý×ÔÉíµÄÓÐЧ¶ÔÆëÖµÔ²Õû(¾ÍÊǽṹÌå³ÉÔ±±äÁ¿Õ¼ÓÃ×ܳ¤¶ÈÐèÒªÊǶԽṹÌåÓÐЧ¶ÔÆëÖµµÄÕûÊý ±¶

£­£­£­£­£­£­£­£­£­£­£­£­
ÉÏÃæÕâ¾ä»°±¾ÉíÀ´½²£¬Ã»ÓÐʲôÎÊÌ⣬µ«ÊÇ¡¡ËƺõÕâ¾äÓÐÎÊÌ⣺¡°4.Êý¾Ý³ÉÔ±¡¢½á¹¹ÌåºÍÀàµÄÓÐЧ¶ÔÆëÖµ£º×ÔÉí¶ÔÆëÖµºÍÖ¸¶¨¶ÔÆëÖµÖÐСµÄÄǸöÖµ¡£¡±¡¡¡¡¡¡Ó¦¸Ã¸ÄΪ¡¡£¢ÓÐЧ¶ÔÆëÖµÊÇ×ÔÉí¶ÔÆëÖµºÍÖ¸¶¨¶ÔÆëÖµÖдóµÄÄǸö¡¡¡¡£¢¡¡¡¡¡¡ÏÔȻӦ¸ÃÊÇ´óµÄÄǸö¡¡¡£¡¡¡¡

Ϊ´ËרÃÅÑéÖ¤ÁËһϡ¡£º

×¢Ò⣺ #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) ¾ÍÊǼÆËãÆ«ÒÆµÄ£¬ ÕâÑù²ÅºÃÖªµÀ±àÒëÆ÷ÊÇÈçºÎ´æ·ÅÎÒÃǵıäÁ¿µÄ¡£

#include <stdio.h>
#include <stdlib.h>

//consider struct aligned


#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

struct zlb {
    char a; //0

    int b;    //4

    short c ; //8

    int d;    //12

    short e;//16

}__attribute__((aligned(8))); //24 £¬×îºóµÄÓÐЧµÄ¶ÔÆëÖµÓ¦¸ÃÊÇ 8 £¨8£¨Ö¸¶¨¶ÔÆëÖµ£© > 4£¨½á¹¹Ìå×ÔÉí¶ÔÆëÖµ£© ) £¬ËùÒÔ ×Ü×Ö½ÚÊýÊÇ 8µÄ±¶Êý ¡£ ¿ÉÒÔ´ÓÏÂÃæµÄ½á¹¹ÌåÀ´ÑéÖ¤£¬ ¿´¿´ struct zlb µÄ·ÅÖÃλÖà £¬ ÊDz»ÊÇ 8 £¬±ã¿ÉÑéÖ¤¡£


struct bob {
    int a ;            // 0

    struct zlb zlb_s;     // 8

    short b;        //32

    char c;            //34

}__attribute__((aligned(16)));        //total : 48

//}__attribute__((__packed__));



int main(void)
{
    printf("size of zlb = %d\n",sizeof(struct zlb));
    printf("offset a=%d\n",offsetof(struct zlb, a));
    printf("offset b=%d\n",offsetof(struct zlb, b));
    printf("offset c=%d\n",offsetof(struct zlb, c));
    printf("offset d=%d\n",offsetof(struct zlb, d));
    printf("offset e=%d\n",offsetof(struct zlb, e));
    
    printf("\n\n");

    printf("size of bob struct =%d\n",sizeof(struct bob));
    printf("offset a=%d\n",offsetof(struct bob,a));
    printf("offset struct zlb=%d\n",offsetof(struct bob, zlb_s));
    printf("offset b=%d\n",offsetof(struct bob, b));
    printf("offset c=%d\n",offsetof(struct bob, c));
//    printf("size of tt struct =%d\n",sizeof(struct tt));

    return 0;
}

Ö´Ðнá¹û£º
pc x86 £¨armÉÏÒ²ÊÇÈç´Ë£©
size of zlb = 24
offset a=0
offset b=4
offset c=8
offset d=12
offset e=16

size of bob struct =48
offset a=0
offset struct zlb=8 //ÔõôÑù£¿ ȷʵÊÇ 8 ,¶ø²»ÊÇ 4°É£¿ ËùÒÔ×÷Õߵϰ´íÁË¡£ ½á¹¹ÌåµÄÓÐЧ¶ÔÆëÖµÓ¦¸ÃÊÇ ½á¹¹Ìå×ÔÉí¶ÔÆëÖµºÍ Ö¸¶¨¶ÔÆëÖµ£¨»òĬÈÏ¶ÔÆëÖµ£©½Ï´óµÄÄǸö
offset b=32
offset c=34


´ËÌûÓÚ 2007-04-28 05:06 PM ±» ÉϵÛÖ®ÊÖ ±à¼­.  
^_^£¬ ÉϵÛÖ®ÊÖ¾ÍÊÇÔÚÏÂÁË¡£
 

²©¿ÍÍÆ¼öÎÄÕÂ
[·¢ÆÀÂÛ] ÆÀÂÛ ÖØÒªÌáʾ£º¾¯ÌèÐé¼ÙÖн±ÐÅÏ¢!
  • bob_zhang2004 2007-11-15 18:46
    x86 µ±È»ÊÇlittle endianµÄ¡£
  • chinaunixÍøÓÑ 2007-05-18 21:05
    Ó¡ÏóÖоÍx86ÊÇlittle endian°É
  • bob_zhang2004 2007-05-12 16:58
    ´ó¼ÒÒ»ÆðÌÖÂÛϰɡ£
Ç×£¬Äú»¹Ã»ÓеǼ,Çë[µÇ¼]»ò[×¢²á]ºóÔÙ½øÐÐÆÀÂÛ