±à¼ÍƼö: |
±¾½ÚÖ÷Òª×ܽáÁËǶÈëʽCµÄһЩÓ÷¨£¬°üÀ¨ÄÚ´æ¹ÜÀí¡¢¾²Ì¬ÄÚ´æ¡¢¶¯Ì¬ÄÚ´æ¡¢×÷ÓÃÓò¡¢Á´½Ó
¡¢ÄÚ´æ¶ÔÆë£¬Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚµç×Ó¹¤³ÌÊÀ½ç-ÍøÂçÕûÀí£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
ÄÚ´æ¹ÜÀí
ÎÒÃÇÐèÒªÖªµÀ¡ª¡ª±äÁ¿£¬ÆäʵÊÇÄÚ´æµØÖ·µÄÒ»¸ö³éÏñÃû×Ö°ÕÁË¡£ÔÚ¾²Ì¬±àÒëµÄ³ÌÐòÖУ¬ËùÓеıäÁ¿Ãû¶¼»áÔÚ±àÒëʱ±»×ª³ÉÄÚ´æµØÖ·¡£»úÆ÷ÊDz»ÖªµÀÎÒÃÇÈ¡µÄÃû×ֵģ¬Ö»ÖªµÀµØÖ·¡£
ÄÚ´æµÄʹÓÃʱ³ÌÐòÉè¼ÆÖÐÐèÒª¿¼ÂǵÄÖØÒªÒòËØÖ®Ò»£¬Õâ²»½öÓÉÓÚϵͳÄÚ´æÊÇÓÐÏ޵ģ¨ÓÈÆäÔÚǶÈëʽϵͳÖУ©£¬¶øÇÒÄÚ´æ·ÖÅäÒ²»áÖ±½ÓÓ°Ïìµ½³ÌÐòµÄЧÂÊ¡£Òò´Ë£¬ÎÒÃÇÒª¶ÔCÓïÑÔÖеÄÄÚ´æ¹ÜÀí£¬ÓиöϵͳµÄÁ˽⡣
ÔÚCÓïÑÔÖУ¬¶¨ÒåÁË4¸öÄÚ´æÇø¼ä£º´úÂëÇø£»È«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿Çø£»¾Ö²¿±äÁ¿Çø¼´Õ»Çø£»¶¯Ì¬´æ´¢Çø£¬¼´¶ÑÇø£»¾ßÌåÈçÏ£º
1¡¢Õ»Çø£¨stack£©¡ª ÓɱàÒëÆ÷×Ô¶¯·ÖÅäÊÍ·Å £¬´æ·Åº¯ÊýµÄ²ÎÊýÖµ£¬¾Ö²¿±äÁ¿µÄÖµµÈ¡£Æä²Ù×÷·½Ê½ÀàËÆÓÚÊý¾Ý½á¹¹ÖеÄÕ»¡£
2¡¢¶ÑÇø£¨heap£© ¡ª Ò»°ãÓɳÌÐòÔ±·ÖÅäÊÍ·Å£¬ Èô³ÌÐòÔ±²»ÊÍ·Å£¬³ÌÐò½áÊøÊ±¿ÉÄÜÓÉOS»ØÊÕ
¡£×¢ÒâËüÓëÊý¾Ý½á¹¹ÖеĶÑÊÇÁ½»ØÊ£¬·ÖÅ䷽ʽµ¹ÊÇÀàËÆÓÚÁ´±í¡£
3¡¢È«¾ÖÇø£¨¾²Ì¬Çø£©£¨static£©¡ªÈ«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿µÄ´æ´¢ÊÇ·ÅÔÚÒ»¿éµÄ£¬³õʼ»¯µÄÈ«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿ÔÚÒ»¿éÇøÓò£¬
δ³õʼ»¯µÄÈ«¾Ö±äÁ¿ºÍδ³õʼ»¯µÄ¾²Ì¬±äÁ¿ÔÚÏàÁÚµÄ ÁíÒ»¿éÇøÓò¡£ - ³ÌÐò½áÊøºóÓÉϵͳÊÍ·Å¡£
4¡¢³£Á¿Çø ¡ª³£Á¿×Ö·û´®¾ÍÊÇ·ÅÔÚÕâÀïµÄ¡£ ³ÌÐò½áÊøºóÓÉϵͳÊÍ·Å¡£
5¡¢³ÌÐò´úÂëÇø¡ª´æ·Åº¯ÊýÌåµÄ¶þ½øÖÆ´úÂë¡£
ÎÒÃÇÀ´¿´ÕÅͼ£º

ͼ1
Ê×ÏÈÎÒÃÇÒªÖªµÀ£¬Ô´´úÂë±àÒë³É³ÌÐò£¬³ÌÐòÊÇ·ÅÔÚÓ²ÅÌÉϵ쬶ø·ÇÄÚ´æÀֻÓÐÖ´ÐÐʱ²Å»á±»µ÷Óõ½ÄÚ´æÖУ¡ÎÒÃÇÀ´¿´¿´³ÌÐò½á¹¹£¬ELFÊÇÊÇLinuxµÄÖ÷Òª¿ÉÖ´ÐÐÎļþ¸ñʽ¡£ELFÎļþÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇELFÍ·£¨ELF
header£©¡¢³ÌÐòÍ·±í£¨Program header table£©¡¢½Ú£¨Section£©ºÍ½ÚÍ·±í£¨Section
header table£©¡£¾ßÌåÈçÏ£º
1¡¢Program headerÃèÊöµÄÊÇÒ»¸ö¶ÎÔÚÎļþÖеÄλÖᢴóСÒÔ¼°Ëü±»·Å½øÄÚ´æºóËùÔÚµÄλÖúʹóС¡£¼´Òª¼ÓÔØµÄÐÅÏ¢£»
2¡¢Sections±£´æ×Åobject ÎļþµÄÐÅÏ¢£¬´ÓÁ¬½Ó½Ç¶È¿´£º°üÀ¨Ö¸ÁÊý¾Ý£¬·ûºÅ±í£¬Öض¨Î»ÐÅÏ¢µÈµÈ¡£ÔÚͼÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½SectionsÖаüÀ¨£º
text Îı¾½á ´æ·ÅÖ¸Á
rodata Êý¾Ý½á readonly;
data Êý¾Ý½á ¿É¶Á¿Éд£»
3¡¢SectionÍ·±í£¨section header table£©°üº¬ÁËÃèÊöÎļþsectionsµÄÐÅÏ¢¡£Ã¿¸ösectionÔÚÕâ¸ö±íÖÐÓÐÒ»¸öÈë¿Ú£»Ã¿¸öÈë¿Ú¸ø³öÁ˸ÃsectionµÄÃû×Ö£¬´óС£¬µÈµÈÐÅÏ¢¡£Ï൱ÓÚ
Ë÷Òý£¡
¶ø³ÌÐò±»¼ÓÔØµ½ÄÚ´æÀïÃæ£¬ÓÖÊÇÈçºÎ·Ö²¼µÄÄØ£¿ÎÒÃÇ¿´¿´ÉÏͼÖУº
1¡¢ÕýÎĺͳõʼ»¯µÄÊý¾ÝºÍδ³õʼ»¯µÄÊý¾Ý¾ÍÊÇÎÒÃÇËù˵µÄÊý¾Ý¶Î£¬ÕýÎļ´´úÂë¶Î£»
2¡¢ÕýÎĶÎÉÏÃæÊdz£Á¿Çø£¬³£Á¿ÇøÉÏÃæÊÇÈ«¾Ö±äÁ¿ºÍ¾²Ì¬±äÁ¿Çø£¬¶þÕßÕ¼¾ÝµÄ¾ÍÊdzõʼ»¯µÄÊý¾ÝºÍδ³õʼ»¯µÄÊý¾ÝÄDz¿·Ö£»
3¡¢ÔÙÉÏÃæ¾ÍÊǶѣ¬¶¯Ì¬´æ´¢Çø£¬ÕâÀïÊÇÉÏÔö³¤£»
4¡¢¶ÑÉÏÃæÊÇÕ»£¬´æ·ÅµÄÊǾֲ¿±äÁ¿£¬¾ÍÊǾֲ¿±äÁ¿ËùÔÚ´úÂë¿éÖ´ÐÐÍê±Ïºó£¬Õâ¿éÄÚ´æ»á±»ÊÍ·Å£¬ÕâÀïÕ»ÇøÊÇÏÂÔö³¤£»
5¡¢ÃüÁîÐвÎÊý¾ÍÊÇ001Ö®ÀàµÄ£¬»·¾³±äÁ¿Ê²Ã´µÄÇ°ÃæµÄÎÄÕÂÒѾ½²¹ý£¬ÓÐÐËȤµÄ¿ÉÒÔÈ¥¿´¿´¡£
ÎÒÃÇÖªµÀ£¬ÄÚ´æ·ÖΪ¶¯Ì¬ÄÚ´æºÍ¾²Ì¬Äڴ棬ÎÒÃÇÏȽ²¾²Ì¬ÄÚ´æ¡£
¾²Ì¬ÄÚ´æ
´æ´¢Ä£Ð;ö¶¨ÁËÒ»¸ö±äÁ¿µÄÄÚ´æ·ÖÅ䷽ʽºÍ·ÃÎÊÌØÐÔ£¬ÔÚCÓïÑÔÖÐÖ÷ÒªÓÐÈý¸öά¶ÈÀ´¾ö¶¨£º´æ´¢Ê±ÆÚ
¡¢×÷ÓÃÓò ¡¢Á´½Ó¡£
´æ´¢Ê±ÆÚ
´æ´¢Ê±ÆÚ£º±äÁ¿ÔÚÄÚ´æÖеı£Áôʱ¼ä£¨ÉúÃüÖÜÆÚ£©
´æ´¢Ê±ÆÚ·ÖΪÁ½ÖÖÇé¿ö£¬¹Ø¼üÊÇ¿´±äÁ¿ÔÚ³ÌÐòÖ´Ðйý³ÌÖл᲻»á±»ÏµÍ³×Ô¶¯»ØÊÕµô¡£
1) ¾²Ì¬´æ´¢Ê±ÆÚ Static
ÔÚ³ÌÐòÖ´Ðйý³ÌÖÐÒ»µ©·ÖÅä¾Í²»»á±»×Ô¶¯»ØÊÕ¡£
ͨ³£À´Ëµ£¬Èκβ»ÔÚº¯Êý¼¶±ð´úÂë¿éÄÚ¶¨ÒåµÄ±äÁ¿¡£
ÎÞÂÛÊÇ·ñÔÚ´úÂë¿éÄÚ£¬Ö»Òª²ÉÓÃstatic¹Ø¼ü×ÖÐÞÊεıäÁ¿¡£
2) ×Ô¶¯´æ´¢Ê±ÆÚ Automatic
³ýÁ˾²Ì¬´æ´¢ÒÔÍâµÄ±äÁ¿¶¼ÊÇ×Ô¶¯´æ´¢Ê±ÆÚµÄ£¬»òÕß˵ֻҪÊÇÔÚ´úÂë¿éÄÚ¶¨ÒåµÄ·ÇstaticµÄ±äÁ¿£¬ÏµÍ³»á¶ÇÆê×Ô¶¯·ÇÅäºÍÊÍ·ÅÄڴ棻
×÷ÓÃÓò
×÷ÓÃÓò£ºÒ»¸ö±äÁ¿ÔÚ¶¨Òå¸Ã±äÁ¿µÄ×ÔÉíÎļþÖеĿɼûÐÔ£¨·ÃÎÊ»òÕßÒýÓã©
ÔÚCÓïÑÔÖУ¬Ò»¹²ÓÐ3ÖÐ×÷ÓÃÓò£º
1) ´úÂë¿é×÷ÓÃÓò
ÔÚ´úÂë¿éÖж¨ÒåµÄ±äÁ¿¶¼¾ßÓиôúÂëµÄ×÷ÓÃÓò¡£´ÓÕâ¸ö±äÁ¿¶¨Ò嵨·½¿ªÊ¼£¬µ½Õâ¸ö´úÂë¿é½áÊø£¬¸Ã±äÁ¿ÊǿɼûµÄ£»
2) º¯ÊýÔÐÍ×÷ÓÃÓò
³öÏÖÔÚº¯ÊýÔÐÍÖеıäÁ¿£¬¶¼¾ßÓк¯ÊýÔÐÍ×÷ÓÃÓò£¬º¯ÊýÔÐÍ×÷ÓÃÓò´Ó±äÁ¿¶¨Òå´¦Ò»Ö±µ½ÔÐÍÉùÃ÷µÄĩβ¡£
3) Îļþ×÷ÓÃÓò
Ò»¸öÔÚËùÓк¯ÊýÖ®ÍⶨÒåµÄ±äÁ¿¾ßÓÐÎļþ×÷ÓÃÓò£¬¾ßÓÐÎļþ×÷ÓÃÓòµÄ±äÁ¿´ÓËüµÄ¶¨Òå´¦µ½°üº¬¸Ã¶¨ÒåµÄÎļþ½áβ´¦¶¼ÊǿɼûµÄ£»
Á´½Ó
Á´½Ó£ºÒ»¸ö±äÁ¿ÔÚ×é³É³ÌÐòµÄËùÓÐÎļþÖеĿɼûÐÔ£¨·ÃÎÊ»òÕßÒýÓã©£»
CÓïÑÔÖÐÒ»¹²ÓÐÈýÖÖ²»Í¬µÄÁ´½Ó£º
1) ÍⲿÁ´½Ó
Èç¹ûÒ»¸ö±äÁ¿ÔÚ×é³ÉÒ»¸ö³ÌÐòµÄËùÓÐÎļþÖеÄÈκÎλÖö¼¿ÉÒÔ±»·ÃÎÊ£¬Ôò³Æ¸Ã±äÁ¿Ö§³ÖÍⲿÁ´½Ó£»
2) ÄÚ²¿Á´½Ó
Èç¹ûÒ»¸ö±äÁ¿Ö»¿ÉÒÔÔÚ¶¨ÒåÆä×ÔÉíµÄÎļþÖеÄÈκÎλÖñ»·ÃÎÊ£¬Ôò³Æ¸Ã±äÁ¿Ö§³ÖÄÚ²¿Á´½Ó¡£
3) ¿ÕÁ´½Ó
Èç¹ûÒ»¸ö±äÁ¿Ö»ÊDZ»¶¨ÒåÆä×ÔÉíµÄµ±Ç°´úÂë¿éËù˽ÓУ¬²»Äܱ»³ÌÐòµÄÆäËû²¿·ÖËù·ÃÎÊ£¬Ôò³É¸Ã±äÁ¿Ö§³Ö¿ÕÁ´½Ó
ÎÒÃÇÀ´¿´Ò»¸ö´úÂëʾÀý£º
#include <stdio.h>
int a = 0;// È«¾Ö³õʼ»¯Çø
char *p1; //È«¾Öδ³õʼ»¯Çø
int main()
{
int b; //bÔÚÕ»Çø
char s[] = "abc"; //Õ»
char *p2; //p2ÔÚÕ»Çø
char *p3 = "123456"; //123456\0ÔÚ³£Á¿Çø£¬p3ÔÚÕ»ÉÏ¡£
static int c =0£» //È«¾Ö£¨¾²Ì¬£©³õʼ»¯Çø
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //·ÖÅäµÃÀ´µÃ10ºÍ20×Ö½ÚµÄÇøÓò¾ÍÔÚ¶ÑÇø¡£
strcpy(p1, "123456"); //123456\0·ÅÔÚ³£Á¿Çø£¬±àÒëÆ÷¿ÉÄܻὫËüÓëp3ËùÖ¸ÏòµÄ"123456"ÓÅ»¯³ÉÒ»¸öµØ·½¡£
}
1.2¶¯Ì¬ÄÚ´æ
µ±³ÌÐòÔËÐе½ÐèÒªÒ»¸ö¶¯Ì¬·ÖÅäµÄ±äÁ¿Ê±£¬±ØÐëÏòϵͳÉêÇëÈ¡µÃ¶ÑÖеÄÒ»¿éËùÐè´óСµÄ´æ´¢¿Õ¼ä£¬ÓÃÓÚ´æ´¢¸Ã±äÁ¿¡£µ±²»ÔÚʹÓøñäÁ¿Ê±£¬Ò²¾ÍÊÇËüµÄÉúÃü½áÊøÊ±£¬ÒªÏÔʾÊÍ·ÅËüËùÕ¼ÓõĴ洢¿Õ¼ä£¬ÕâÑùϵͳ¾ÍÄܶԸÿռä
½øÐÐÔٴηÖÅ䣬×öµ½Öظ´Ê¹ÓÃÓÐÏßµÄ×ÊÔ´¡£ÏÂÃæ½éÉܶ¯Ì¬ÄÚ´æÉêÇëºÍÊͷŵĺ¯Êý¡£
1.2.1 malloc º¯Êý
mallocº¯ÊýÔÐÍ£º

sizeÊÇÐèÒª¶¯Ì¬ÉêÇëµÄÄÚ´æµÄ×Ö½ÚÊý¡£ÈôÉêÇë³É¹¦£¬º¯Êý·µ»ØÉêÇëµ½µÄÄÚ´æµÄÆðʼµØÖ·£¬ÈôÉêÇëʧ°Ü£¬·µ»ØNULL¡£ÎÒÃÇ¿´ÏÂÃæÕâ¸öÀý×Ó£º

ʹÓøú¯Êýʱ£¬ÓÐÏÂÃæ¼¸µãҪעÒ⣺
1£©Ö»¹ØÐÄÉêÇëÄÚ´æµÄ´óС£»
2£©ÉêÇëµÄÊÇÒ»¿éÁ¬ÐøµÄÄÚ´æ¡£¼ÇµÃÒ»¶¨ÒªÐ´³ö´íÅжϣ»
3£©ÏÔʾ³õʼ»¯¡£¼´ÎÒÃDz»ÖªÕâ¿éÄÚ´æÖÐÓÐʲô¶«Î÷£¬Òª¶ÔÆäÇåÁ㣻
1.2.2 freeº¯Êý
ÔÚ¶ÑÉÏ·ÖÅäµÄ¶îÄڴ棬ÐèÒªÓÃfreeº¯ÊýÏÔʾÊÍ·Å£¬º¯ÊýÔÐÍÈçÏ£º

ʹÓÃfree(),Ò²ÓÐÏÂÃæ¼¸µãҪעÒ⣺
1£©±ØÐëÌṩÄÚ´æµÄÆðʼµØÖ·£»
µ÷Óøú¯Êýʱ£¬±ØÐëÌṩÄÚ´æµÄÆðʼµØÖ·£¬²»Äܹ»Ìṩ²¿·ÖµØÖ·£¬ÊÍ·ÅÄÚ´æÖеÄÒ»²¿·ÖÊDz»ÔÊÐíµÄ¡£
2£©mallocºÍfreeÅä¶ÔʹÓã»
±àÒëÆ÷²»¸ºÔð¶¯Ì¬ÄÚ´æµÄÊÍ·Å£¬ÐèÒª³ÌÐòÔ±ÏÔʾÊÍ·Å¡£Òò´Ë£¬mallocÓëfreeÊÇÅä¶ÔʹÓõ쬱ÜÃâÄÚ´æÐ¹Â©¡£

p = NULLÊDZØÐëµÄ£¬ÒòΪËäÈ»Õâ¿éÄÚ´æ±»ÊÍ·ÅÁË£¬µ«ÊÇpÈÔÖ¸ÏòÕâ¿éÄڴ棬±ÜÃâÏ´ζÔpµÄÎó²Ù×÷£»
3£©²»ÔÊÐíÖØ¸´ÊÍ·Å
ÒòΪÕâ¿éÄÚ´æ±»Êͷź󣬿ÉÄÜÒÑÁí·ÖÅ䣬Õâ¿éÇøÓò±»±ðÈËÕ¼Óã¬Èç¹ûÔÙ´ÎÊÍ·Å£¬»áÔì³ÉÊý¾Ý¶ªÊ§£»
1.2.3 ÆäËüÏà¹Øº¯Êý
callocº¯Êý·ÖÅäÄÚ´æÐèÒª¿¼ÂǴ洢λÖõÄÀàÐÍ¡£
reallocº¯Êý¿ÉÒÔµ÷ÕûÒ»¶Î¶¯Ì¬·ÖÅäÄÚ´æµÄ´óС
1.3¶ÑºÍÕ»±È½Ï
1£©ÉêÇ뷽ʽ
stack: ÓÉϵͳ×Ô¶¯·ÖÅä¡£ ÀýÈ磬ÉùÃ÷ÔÚº¯ÊýÖÐÒ»¸ö¾Ö²¿±äÁ¿ int b; ϵͳ×Ô¶¯ÔÚÕ»ÖÐΪb¿ª±Ù¿Õ¼ä
heap: ÐèÒª³ÌÐòÔ±×Ô¼ºÉêÇ룬²¢Ö¸Ã÷´óС£¬ÔÚcÖÐmallocº¯Êý
,Èçp1 = (char *)malloc(10);
2£©ÉêÇëºóϵͳµÄÏìÓ¦
Õ»£ºÖ»ÒªÕ»µÄÊ£Óà¿Õ¼ä´óÓÚËùÉêÇë¿Õ¼ä£¬ÏµÍ³½«Îª³ÌÐòÌṩÄڴ棬·ñÔò½«±¨Òì³£ÌáʾջÒç³ö¡£
¶Ñ£ºÊ×ÏÈÓ¦¸ÃÖªµÀ²Ù×÷ϵͳÓÐÒ»¸ö¼Ç¼¿ÕÏÐÄÚ´æµØÖ·µÄÁ´±í£¬µ±ÏµÍ³ÊÕµ½³ÌÐòµÄÉêÇëʱ£¬»á±éÀú¸ÃÁ´±í£¬Ñ°ÕÒµÚÒ»¸ö¿Õ¼ä´óÓÚËùÉêÇë¿Õ¼äµÄ¶Ñ½áµã£¬È»ºó½«¸Ã½áµã´Ó¿ÕÏнáµãÁ´±íÖÐɾ³ý£¬²¢½«¸Ã½áµãµÄ¿Õ¼ä·ÖÅ䏸³ÌÐò£¬ÁíÍ⣬¶ÔÓÚ´ó¶àÊýϵͳ£¬»áÔÚÕâ¿éÄÚ´æ¿Õ¼äÖеÄÊ×µØÖ·´¦¼Ç¼±¾´Î·ÖÅäµÄ´óС£¬ÕâÑù£¬´úÂëÖеÄdeleteÓï¾ä²ÅÄÜÕýÈ·µÄÊͷű¾ÄÚ´æ¿Õ¼ä¡£ÁíÍ⣬ÓÉÓÚÕÒµ½µÄ¶Ñ½áµãµÄ´óС²»Ò»¶¨ÕýºÃµÈÓÚÉêÇëµÄ´óС£¬ÏµÍ³»á×Ô¶¯µÄ½«¶àÓàµÄÄDz¿·ÖÖØÐ·ÅÈë¿ÕÏÐÁ´±íÖС£
3£©ÉêÇë´óСµÄÏÞÖÆ
Õ»£ºÕ»ÊÇÏòµÍµØÖ·À©Õ¹µÄÊý¾Ý½á¹¹£¬ÊÇÒ»¿éÁ¬ÐøµÄÄÚ´æµÄÇøÓò¡£Õâ¾ä»°µÄÒâ˼ÊÇÕ»¶¥µÄµØÖ·ºÍÕ»µÄ×î´óÈÝÁ¿ÊÇϵͳԤÏȹ涨ºÃµÄ£¬Õ»µÄ´óСÊÇ2M£¨Ò²ÓеÄ˵ÊÇ1M£¬×ÜÖ®ÊÇÒ»¸ö±àÒëʱ¾ÍÈ·¶¨µÄ³£Êý£©£¬Èç¹ûÉêÇëµÄ¿Õ¼ä³¬¹ýÕ»µÄÊ£Óà¿Õ¼äʱ£¬½«Ìáʾoverflow¡£Òò´Ë£¬ÄÜ´ÓÕ»»ñµÃµÄ¿Õ¼ä½ÏС¡£
¶Ñ£º¶ÑÊÇÏò¸ßµØÖ·À©Õ¹µÄÊý¾Ý½á¹¹£¬ÊDz»Á¬ÐøµÄÄÚ´æÇøÓò¡£ÕâÊÇÓÉÓÚϵͳÊÇÓÃÁ´±íÀ´´æ´¢µÄ¿ÕÏÐÄÚ´æµØÖ·µÄ£¬×ÔÈ»ÊDz»Á¬ÐøµÄ£¬¶øÁ´±íµÄ±éÀú·½ÏòÊÇÓɵ͵ØÖ·Ïò¸ßµØÖ·¡£¶ÑµÄ´óСÊÜÏÞÓÚ¼ÆËã»úϵͳÖÐÓÐЧµÄÐéÄâÄÚ´æ¡£Óɴ˿ɼû£¬¶Ñ»ñµÃµÄ¿Õ¼ä±È½ÏÁé»î£¬Ò²±È½Ï´ó¡£
4£©ÉêÇëЧÂʵıȽÏ
Õ»ÓÉϵͳ×Ô¶¯·ÖÅ䣬ËٶȽϿ졣µ«³ÌÐòÔ±ÊÇÎÞ·¨¿ØÖƵġ£
¶ÑÊÇÓÉnew·ÖÅäµÄÄڴ棬һ°ãËٶȱȽÏÂý£¬¶øÇÒÈÝÒײúÉúÄÚ´æË鯬,²»¹ýÓÃÆðÀ´×î·½±ã¡£
5£©¶ÑºÍÕ»ÖеĴ洢ÄÚÈÝ
Õ»£ºÔÚº¯Êýµ÷ÓÃʱ£¬µÚÒ»¸ö½øÕ»µÄÊÇÖ÷º¯ÊýÖкóµÄÏÂÒ»ÌõÖ¸Áº¯Êýµ÷ÓÃÓï¾äµÄÏÂÒ»Ìõ¿ÉÖ´ÐÐÓï¾ä£©µÄµØÖ·£¬È»ºóÊǺ¯ÊýµÄ¸÷¸ö²ÎÊý£¬ÔÚ´ó¶àÊýµÄC±àÒëÆ÷ÖУ¬²ÎÊýÊÇÓÉÓÒÍù×óÈëÕ»µÄ£¬È»ºóÊǺ¯ÊýÖеľֲ¿±äÁ¿¡£×¢Ò⾲̬±äÁ¿ÊDz»ÈëÕ»µÄ¡£
µ±±¾´Îº¯Êýµ÷ÓýáÊøºó£¬¾Ö²¿±äÁ¿ÏȳöÕ»£¬È»ºóÊDzÎÊý£¬×îºóÕ»¶¥Ö¸ÕëÖ¸Ïò×ʼ´æµÄµØÖ·£¬Ò²¾ÍÊÇÖ÷º¯ÊýÖеÄÏÂÒ»ÌõÖ¸Á³ÌÐòÓɸõã¼ÌÐøÔËÐС£
¶Ñ£ºÒ»°ãÊÇÔڶѵÄÍ·²¿ÓÃÒ»¸ö×Ö½Ú´æ·Å¶ÑµÄ´óС¡£¶ÑÖеľßÌåÄÚÈÝÓɳÌÐòÔ±°²ÅÅ¡£
6£©´æÈ¡Ð§ÂʵıȽÏ
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaaÊÇÔÚÔËÐÐʱ¿Ì¸³ÖµµÄ£»
¶øbbbbbbbbbbbÊÇÔÚ±àÒëʱ¾ÍÈ·¶¨µÄ£»
µ«ÊÇ£¬ÔÚÒÔºóµÄ´æÈ¡ÖУ¬ÔÚÕ»ÉϵÄÊý×é±ÈÖ¸ÕëËùÖ¸ÏòµÄ×Ö·û´®(ÀýÈç¶Ñ)¿ì¡£
±ÈÈ磺

¶ÔÓ¦µÄ»ã±à´úÂë

µÚÒ»ÖÖÔÚ¶Áȡʱֱ½Ó¾Í°Ñ×Ö·û´®ÖеÄÔªËØ¶Áµ½¼Ä´æÆ÷clÖУ¬¶øµÚ¶þÖÖÔòÒªÏȰÑÖ¸ÕëÖµ¶Áµ½edxÖУ¬ÔÙ¸ù¾Ýedx¶ÁÈ¡×Ö·û£¬ÏÔÈ»ÂýÁË¡£
7£©×îºó×ܽá
¶ÑºÍÕ»µÄÇø±ð¿ÉÒÔÓÃÈçϵıÈÓ÷À´¿´³ö£º
Õ»¾ÍÏñÎÒÃÇÈ¥·¹¹ÝÀï³Ô·¹£¬Ö»¹Üµã²Ë£¨·¢³öÉêÇ룩¡¢¸¶Ç®¡¢ºÍ³Ô£¨Ê¹Óã©£¬³Ô±¥Á˾Í×ߣ¬²»±ØÀí»áÇвˡ¢Ï´²ËµÈ×¼±¸¹¤×÷ºÍÏ´Í롢ˢ¹øµÈɨβ¹¤×÷£¬ËûµÄºÃ´¦ÊÇ¿ì½Ý£¬µ«ÊÇ×ÔÓɶÈС¡£
¶Ñ¾ÍÏóÊÇ×Ô¼º¶¯ÊÖ×öϲ»¶³ÔµÄ²ËëÈ£¬±È½ÏÂé·³£¬µ«ÊDZȽϷûºÏ×Ô¼ºµÄ¿Ú棬¶øÇÒ×ÔÓɶȴó¡£
2¡¢ÄÚ´æ¶ÔÆë
2.1 #pragma pack(n) ¶ÔÆëÓ÷¨Ïê½â
1.ʲôÊÇ¶ÔÆë£¬ÒÔ¼°ÎªÊ²Ã´Òª¶ÔÆë
ÏÖ´ú¼ÆËã»úÖÐÄÚ´æ¿Õ¼ä¶¼Êǰ´ÕÕbyte»®·ÖµÄ£¬´ÓÀíÂÛÉϽ²Ëƺõ¶ÔÈκÎÀàÐ͵ıäÁ¿µÄ·ÃÎÊ¿ÉÒÔ´ÓÈκεØÖ·¿ªÊ¼£¬µ«Êµ¼ÊÇé¿öÊÇÔÚ·ÃÎÊÌØ¶¨±äÁ¿µÄʱºò¾³£ÔÚÌØ¶¨µÄÄÚ´æµØÖ··ÃÎÊ£¬Õâ¾ÍÐèÒª¸÷ÀàÐÍÊý¾Ý°´ÕÕÒ»¶¨µÄ¹æÔòÔÚ¿Õ¼äÉÏÅÅÁУ¬¶ø²»ÊÇ˳ÐòµÄÒ»¸ö½ÓÒ»¸öµÄÅÅ·Å£¬Õâ¾ÍÊÇ¶ÔÆë¡£
¶ÔÆëµÄ×÷ÓúÍÔÒò£º¸÷¸öÓ²¼þƽ̨¶Ô´æ´¢¿Õ¼äµÄ´¦ÀíÉÏÓкܴóµÄ²»Í¬¡£Ò»Ð©Æ½Ì¨¶ÔÄ³Ð©ÌØ¶¨ÀàÐ͵ÄÊý¾ÝÖ»ÄÜ´ÓÄ³Ð©ÌØ¶¨µØÖ·¿ªÊ¼´æÈ¡¡£ÆäËûƽ̨¿ÉÄÜûÓÐÕâÖÖÇé¿ö£¬
µ«ÊÇ×î³£¼ûµÄÊÇÈç¹û²»°´ÕÕÊÊºÏÆäÆ½Ì¨ÒªÇó¶ÔÊý¾Ý´æ·Å½øÐÐ¶ÔÆë£¬»áÔÚ´æÈ¡Ð§ÂÊÉÏ´øÀ´Ëðʧ¡£±ÈÈçÓÐЩƽ̨ÿ´Î¶Á¶¼ÊÇ´ÓżµØÖ·¿ªÊ¼£¬Èç¹ûÒ»¸öintÐÍ£¨¼ÙÉèΪ
32λϵͳ£©Èç¹û´æ·ÅÔÚżµØÖ·¿ªÊ¼µÄµØ·½£¬ÄÇôһ¸ö¶ÁÖÜÆÚ¾Í¿ÉÒÔ¶Á³ö£¬¶øÈç¹û´æ·ÅÔÚÆæµØÖ·¿ªÊ¼µÄµØ·½£¬¾Í¿ÉÄÜ»áÐèÒª2¸ö¶ÁÖÜÆÚ£¬²¢¶ÔÁ½´Î¶Á³öµÄ½á¹ûµÄ¸ßµÍ×Ö½Ú½øÐÐÆ´´Õ²ÅÄܵõ½¸ÃintÊý¾Ý¡£ÏÔÈ»ÔÚ¶ÁȡЧÂÊÉÏϽµºÜ¶à¡£ÕâÒ²ÊǿռäºÍʱ¼äµÄ²©ÞÄ¡£
2.¶ÔÆëµÄʵÏÖ
ͨ³££¬ÎÒÃÇд³ÌÐòµÄʱºò£¬²»ÐèÒª¿¼ÂÇ¶ÔÆëÎÊÌâ¡£±àÒëÆ÷»áÌæÎÒÃÇÑ¡ÔñʱºòÄ¿±êƽ̨µÄ¶ÔÆë²ßÂÔ¡£µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔ֪ͨ¸ø±àÒëÆ÷´«µÝÔ¤±àÒëÖ¸Áî¶ø¸Ä±ä¶ÔÖ¸¶¨Êý¾ÝµÄ¶ÔÆë·½·¨¡£
µ«ÊÇ£¬ÕýÒòΪÎÒÃÇÒ»°ã²»ÐèÒª¹ØÐÄÕâ¸öÎÊÌ⣬ËùÒÔÒòΪ±à¼Æ÷¶ÔÊý¾Ý´æ·Å×öÁË¶ÔÆë£¬¶øÎÒÃDz»Á˽âµÄ»°£¬³£³£»á¶ÔһЩÎÊÌâ¸Ðµ½ÃÔ»ó¡£×î³£¼ûµÄ¾ÍÊÇstructÊý¾Ý½á¹¹µÄsizeof½á¹û£¬³öºõÒâÁÏ¡£Îª´Ë£¬ÎÒÃÇÐèÒª¶Ô¶ÔÆëËã·¨ËùÁ˽⡣
×÷Óãº
Ö¸¶¨½á¹¹Ìå¡¢ÁªºÏÒÔ¼°Àà³ÉÔ±µÄpacking alignment;
Óï·¨£º
#pragma pack( [show] | [push | pop]
[, identifier], n )
˵Ã÷£º
1>packÌṩÊý¾ÝÉùÃ÷¼¶±ðµÄ¿ØÖÆ£¬¶Ô¶¨Òå²»Æð×÷Óã»
2>µ÷ÓÃpackʱ²»Ö¸¶¨²ÎÊý£¬n½«±»Éè³ÉĬÈÏÖµ£»
3>Ò»µ©¸Ä±äÊý¾ÝÀàÐ͵Äalignment£¬Ö±½ÓЧ¹û¾ÍÊÇÕ¼ÓÃmemoryµÄ¼õÉÙ£¬µ«ÊÇperformance»áϽµ£»
3.Óï·¨¾ßÌå·ÖÎö
1>show£º¿ÉÑ¡²ÎÊý£»ÏÔʾµ±Ç°packing aligmentµÄ×Ö½ÚÊý£¬ÒÔwarning
messageµÄÐÎʽ±»ÏÔʾ£»
2>push£º¿ÉÑ¡²ÎÊý£»½«µ±Ç°Ö¸¶¨µÄpacking alignmentÊýÖµ½øÐÐѹջ²Ù×÷£¬ÕâÀïµÄÕ»ÊÇthe
internal compiler stack£¬Í¬Ê±ÉèÖõ±Ç°µÄpacking alignmentΪn£»Èç¹ûnûÓÐÖ¸¶¨£¬Ôò½«µ±Ç°µÄpacking
alignmentÊýֵѹջ£»
3>pop£º¿ÉÑ¡²ÎÊý£»´Óinternal compiler
stackÖÐɾ³ý×î¶¥¶ËµÄrecord£»Èç¹ûûÓÐÖ¸¶¨n£¬Ôòµ±Ç°Õ»¶¥record¼´ÎªÐµÄpacking
alignmentÊýÖµ£»Èç¹ûÖ¸¶¨ÁËn£¬Ôòn½«³ÉΪеÄpacking aligmentÊýÖµ£»Èç¹ûÖ¸¶¨ÁËidentifier£¬Ôòinternal
compiler stackÖеÄrecord¶¼½«±»popÖ±µ½identifier±»ÕÒµ½£¬È»ºópop³öidentitier£¬Í¬Ê±ÉèÖÃpacking
alignmentÊýֵΪµ±Ç°Õ»¶¥µÄrecord£»Èç¹ûÖ¸¶¨µÄidentifier²¢²»´æÔÚÓÚinternal
compiler stack£¬Ôòpop²Ù×÷±»ºöÂÔ£»
4>identifier£º¿ÉÑ¡²ÎÊý£»µ±Í¬pushÒ»ÆðʹÓÃʱ£¬¸³Ó赱ǰ±»Ñ¹ÈëÕ»ÖеÄrecordÒ»¸öÃû³Æ£»µ±Í¬popÒ»ÆðʹÓÃʱ£¬´Óinternal
compiler stackÖÐpop³öËùÓеÄrecordÖ±µ½identifier±»pop³ö£¬Èç¹ûidentifierûÓб»ÕÒµ½£¬ÔòºöÂÔpop²Ù×÷£»
5>n£º¿ÉÑ¡²ÎÊý£»Ö¸¶¨packingµÄÊýÖµ£¬ÒÔ×Ö½ÚΪµ¥Î»£»È±Ê¡ÊýÖµÊÇ8£¬ºÏ·¨µÄÊýÖµ·Ö±ðÊÇ1¡¢2¡¢4¡¢8¡¢16¡£
4.ÖØÒª¹æÔò
1>¸´ÔÓÀàÐÍÖи÷¸ö³ÉÔ±°´ÕÕËüÃDZ»ÉùÃ÷µÄ˳ÐòÔÚÄÚ´æÖÐ˳Ðò´æ´¢£¬µÚÒ»¸ö³ÉÔ±µÄµØÖ·ºÍÕû¸öÀàÐ͵ĵØÖ·Ïàͬ£»
2>ÿ¸ö³ÉÔ±·Ö±ð¶ÔÆë£¬¼´Ã¿¸ö³ÉÔ±°´×Ô¼ºµÄ·½Ê½¶ÔÆë£¬²¢×îС»¯³¤¶È£»¹æÔò¾ÍÊÇÿ¸ö³ÉÔ±°´ÆäÀàÐÍµÄ¶ÔÆë²ÎÊý£¨Í¨³£ÊÇÕâ¸öÀàÐ͵ĴóС£©ºÍÖ¸¶¨¶ÔÆë²ÎÊýÖнÏСµÄÒ»¸ö¶ÔÆë£»
3>½á¹¹¡¢ÁªºÏ»òÕßÀàµÄÊý¾Ý³ÉÔ±£¬µÚÒ»¸ö·ÅÔÚÆ«ÒÆÎª0µÄµØ·½£»ÒÔºóÿ¸öÊý¾Ý³ÉÔ±µÄ¶ÔÆë£¬°´ÕÕ#pragma
packÖ¸¶¨µÄÊýÖµºÍÕâ¸öÊý¾Ý³ÉÔ±×ÔÉí³¤¶ÈÁ½¸öÖбȽÏСµÄÄǸö½øÐУ»Ò²¾ÍÊÇ˵£¬µ±#pragma packÖ¸¶¨µÄÖµµÈÓÚ»òÕß³¬¹ýËùÓÐÊý¾Ý³ÉÔ±³¤¶ÈµÄʱºò£¬Õâ¸öÖ¸¶¨ÖµµÄ´óС½«²»²úÉúÈκÎЧ¹û;
4>¸´ÔÓÀàÐÍ£¨Èç½á¹¹£©ÕûÌåµÄ¶ÔÆë<×¢ÒâÊÇ¡°ÕûÌ塱>Êǰ´ÕսṹÌåÖ㤶È×î´óµÄÊý¾Ý³ÉÔ±ºÍ#pragma
packÖ¸¶¨ÖµÖ®¼ä½ÏСµÄÄǸöÖµ½øÐУ»ÕâÑùÔÚ³ÉÔ±ÊǸ´ÔÓÀàÐÍʱ£¬¿ÉÒÔ×îС»¯³¤¶È£»
5>½á¹¹ÕûÌ峤¶ÈµÄ¼ÆËã±ØÐëÈ¡ËùÓùýµÄËùÓÐ¶ÔÆë²ÎÊýµÄÕûÊý±¶£¬²»¹»²¹¿Õ×Ö½Ú£»Ò²¾ÍÊÇÈ¡ËùÓùýµÄËùÓÐ¶ÔÆë²ÎÊýÖÐ×î´óµÄÄǸöÖµµÄÕûÊý±¶£¬ÒòΪ¶ÔÆë²ÎÊý¶¼ÊÇ2µÄn´Î·½£»ÕâÑùÔÚ´¦ÀíÊý×éʱ¿ÉÒÔ±£Ö¤Ã¿Ò»Ïî¶¼±ß½ç¶ÔÆë£»
5.¶ÔÆëµÄËã·¨
ÓÉÓÚ¸÷¸öƽ̨ºÍ±àÒëÆ÷µÄ²»Í¬£¬ÏÖÒÔ±¾ÈËʹÓõÄgcc version
3.2.2±àÒëÆ÷£¨32λx86ƽ̨£©ÎªÀý×Ó£¬À´ÌÖÂÛ±àÒëÆ÷¶ÔstructÊý¾Ý½á¹¹Öеĸ÷³ÉÔ±ÈçºÎ½øÐÐ¶ÔÆëµÄ¡£
ÔÚÏàͬµÄ¶ÔÆë·½Ê½Ï£¬½á¹¹ÌåÄÚ²¿Êý¾Ý¶¨ÒåµÄ˳Ðò²»Í¬£¬½á¹¹ÌåÕûÌåÕ¼¾ÝÄÚ´æ¿Õ¼äÒ²²»Í¬£¬ÈçÏ£º
Éè½á¹¹ÌåÈç϶¨Ò壺

½á¹¹ÌåAÖаüº¬ÁË4×Ö½Ú³¤¶ÈµÄintÒ»¸ö£¬1×Ö½Ú³¤¶ÈµÄcharÒ»¸öºÍ2×Ö½Ú³¤¶ÈµÄshortÐÍÊý¾ÝÒ»¸ö¡£ËùÒÔAÓõ½µÄ¿Õ¼äÓ¦¸ÃÊÇ7×Ö½Ú¡£µ«ÊÇÒòΪ±àÒëÆ÷Òª¶ÔÊý¾Ý³ÉÔ±ÔÚ¿Õ¼äÉϽøÐÐ¶ÔÆë¡£ËùÒÔʹÓÃsizeof(strcut
A)ֵΪ8¡£
ÏÖÔڰѸýṹÌåµ÷Õû³ÉÔ±±äÁ¿µÄ˳Ðò¡£

ÕâʱºòͬÑùÊÇ×ܹ²7¸ö×ֽڵıäÁ¿£¬µ«ÊÇsizeof(struct B)µÄֵȴÊÇ12¡£
ÏÂÃæÎÒÃÇʹÓÃÔ¤±àÒëÖ¸Áî#progma pack (value)À´¸æËß±àÒëÆ÷£¬Ê¹ÓÃÎÒÃÇÖ¸¶¨µÄ¶ÔÆëÖµÀ´È¡´úȱʡµÄ¡£

sizeof(struct C)ÖµÊÇ8¡£
ÐÞ¸Ä¶ÔÆëֵΪ1£º

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

¼ÙÉèB´ÓµØÖ·¿Õ¼ä0x0000¿ªÊ¼ÅÅ·Å¡£¸ÃÀý×ÓÖÐûÓж¨ÒåÖ¸¶¨¶ÔÆëÖµ£¬ÔÚ±ÊÕß»·¾³Ï£¬¸ÃֵĬÈÏΪ4¡£
µÚÒ»¸ö³ÉÔ±±äÁ¿bµÄ×ÔÉí¶ÔÆëÖµÊÇ1£¬±ÈÖ¸¶¨»òÕßĬÈÏÖ¸¶¨¶ÔÆëÖµ4С£¬ËùÒÔÆäÓÐЧ¶ÔÆëֵΪ1£¬ËùÒÔÆä´æ·ÅµØÖ·0x0000·ûºÏ0x0000%1=0.
µÚ¶þ¸ö³ÉÔ±±äÁ¿a£¬Æä×ÔÉí¶ÔÆëֵΪ4£¬ËùÒÔÓÐЧ¶ÔÆëֵҲΪ4£¬ËùÒÔÖ»ÄÜ´æ·ÅÔÚÆðʼµØÖ·Îª0x0004µ½0x0007ÕâËĸöÁ¬ÐøµÄ×Ö½Ú¿Õ¼äÖУ¬·ûºÏ0x0004%4=0,
ÇÒ½ô¿¿µÚÒ»¸ö±äÁ¿¡£
µÚÈý¸ö±äÁ¿c,×ÔÉí¶ÔÆëֵΪ2£¬ËùÒÔÓÐЧ¶ÔÆëÖµÒ²ÊÇ2£¬¿ÉÒÔ´æ·ÅÔÚ0x0008µ½0x0009
ÕâÁ½¸ö×Ö½Ú¿Õ¼äÖУ¬·ûºÏ0x0008%2=0¡£ËùÒÔ´Ó0x0000µ½0x0009´æ·ÅµÄ¶¼ÊÇBÄÚÈÝ¡£ÔÙ¿´Êý¾Ý½á¹¹BµÄ×ÔÉí¶ÔÆëֵΪÆä±äÁ¿ÖÐ×î´ó¶ÔÆëÖµ(ÕâÀïÊÇb£©ËùÒÔ¾ÍÊÇ4£¬ËùÒԽṹÌåµÄÓÐЧ¶ÔÆëÖµÒ²ÊÇ4¡£¸ù¾Ý½á¹¹ÌåÔ²ÕûµÄÒªÇó£¬0x0009µ½0x0000=10×Ö½Ú£¬£¨10£«2£©£¥4£½0¡£ËùÒÔ0x0000Aµ½0x000BҲΪ½á¹¹ÌåBËùÕ¼Ó᣹ÊB´Ó0x0000µ½0x000B¹²ÓÐ12¸ö×Ö½Ú,sizeof(struct
B)=12;
ͬÀí,·ÖÎöÉÏÃæÀý×ÓC£º

µÚÒ»¸ö±äÁ¿bµÄ×ÔÉí¶ÔÆëֵΪ1£¬Ö¸¶¨¶ÔÆëֵΪ2£¬ËùÒÔ£¬ÆäÓÐЧ¶ÔÆëֵΪ1£¬¼ÙÉèC´Ó0x0000¿ªÊ¼£¬ÄÇôb´æ·ÅÔÚ0x0000£¬·ûºÏ0x0000%1=0;
µÚ¶þ¸ö±äÁ¿£¬×ÔÉí¶ÔÆëֵΪ4£¬Ö¸¶¨¶ÔÆëֵΪ2£¬ËùÒÔÓÐЧ¶ÔÆëֵΪ2£¬ËùÒÔ˳Ðò´æ·ÅÔÚ0x0002¡¢0x0003¡¢0x0004¡¢0x0005ËĸöÁ¬Ðø×Ö½ÚÖУ¬·ûºÏ0x0002%2=0¡£
µÚÈý¸ö±äÁ¿cµÄ×ÔÉí¶ÔÆëֵΪ2£¬ËùÒÔÓÐЧ¶ÔÆëֵΪ2£¬Ë³Ðò´æ·ÅÔÚ0x0006¡¢0x0007ÖУ¬·ûºÏ0x0006%2=0¡£ËùÒÔ´Ó0x0000µ½0x00007¹²°Ë×Ö½Ú´æ·ÅµÄÊÇCµÄ±äÁ¿¡£
ÓÖCµÄ×ÔÉí¶ÔÆëֵΪ4£¬ËùÒÔCµÄÓÐЧ¶ÔÆëֵΪ2¡£ÓÖ8%2=0,CÖ»Õ¼ÓÃ0x0000µ½0x0007µÄ°Ë¸ö×Ö½Ú¡£ËùÒÔsizeof(struct
C)=8.
9.2.2×Ö½Ú¶ÔÆë¶Ô³ÌÐòµÄÓ°Ïì
ÏÈÈÃÎÒÃÇ¿´¼¸¸öÀý×Ó°É(32bit,x86»·¾³,gcc±àÒëÆ÷):
Éè½á¹¹ÌåÈç϶¨Ò壺

ÏÖÔÚÒÑÖª32λ»úÆ÷Éϸ÷ÖÖÊý¾ÝÀàÐ͵ij¤¶ÈÈçÏÂ:
char:1(ÓзûºÅÎÞ·ûºÅͬ)
short:2(ÓзûºÅÎÞ·ûºÅͬ)
int:4(ÓзûºÅÎÞ·ûºÅͬ)
long:4(ÓзûºÅÎÞ·ûºÅͬ)
float:4 double:8
ÄÇôÉÏÃæÁ½¸ö½á¹¹´óСÈçºÎÄØ?
½á¹ûÊÇ:
sizeof(strcut A)ֵΪ8
sizeof(struct B)µÄֵȴÊÇ12
½á¹¹ÌåAÖаüº¬ÁË4×Ö½Ú³¤¶ÈµÄintÒ»¸ö£¬1×Ö½Ú³¤¶ÈµÄcharÒ»¸öºÍ2×Ö½Ú³¤¶ÈµÄshortÐÍÊý¾ÝÒ»¸ö,BÒ²Ò»Ñù;°´Àí˵A,B´óСӦ¸Ã¶¼ÊÇ7×Ö½Ú¡£Ö®ËùÒÔ³öÏÖÉÏÃæµÄ½á¹ûÊÇÒòΪ±àÒëÆ÷Òª¶ÔÊý¾Ý³ÉÔ±ÔÚ¿Õ¼äÉϽøÐÐ¶ÔÆë¡£ÉÏÃæÊǰ´ÕÕ±àÒëÆ÷µÄĬÈÏÉèÖýøÐÐ¶ÔÆëµÄ½á¹û,ÄÇôÎÒÃÇÊDz»ÊÇ¿ÉÒԸıä±àÒëÆ÷µÄÕâÖÖĬÈÏ¶ÔÆëÉèÖÃÄØ,µ±È»¿ÉÒÔ.ÀýÈç:

sizeof(struct C)ÖµÊÇ8¡£
ÐÞ¸Ä¶ÔÆëֵΪ1£º

sizeof(struct D)ֵΪ7¡£
ºóÃæÎÒÃÇÔÙ½²½â#pragma pack()µÄ×÷ÓÃ.
2.3Ð޸ıàÒëÆ÷µÄĬÈÏ¶ÔÆëÖµ
1>ÔÚVC IDEÖУ¬¿ÉÒÔÕâÑùÐ޸ģº[Project]|[Settings],c/c++Ñ¡ÏCategoryµÄCode
GenerationÑ¡ÏîµÄStruct Member AlignmentÖÐÐ޸ģ¬Ä¬ÈÏÊÇ8×Ö½Ú¡£
2>ÔÚ±àÂëʱ£¬¿ÉÒÔÕâÑù¶¯Ì¬Ð޸ģº#pragma pack .×¢Òâ:ÊÇpragma¶ø²»ÊÇprogma.
Èç¹ûÔÚ±à³ÌµÄʱºòÒª¿¼ÂǽÚÔ¼¿Õ¼äµÄ»°,ÄÇôÎÒÃÇÖ»ÐèÒª¼Ù¶¨½á¹¹µÄÊ×µØÖ·ÊÇ0,È»ºó¸÷¸ö±äÁ¿°´ÕÕÉÏÃæµÄÔÔò½øÐÐÅÅÁм´¿É,»ù±¾µÄÔÔò¾ÍÊǰѽṹÖеıäÁ¿°´ÕÕ
ÀàÐÍ´óС´ÓСµ½´óÉùÃ÷,¾¡Á¿¼õÉÙÖмäµÄÌî²¹¿Õ¼ä.»¹ÓÐÒ»ÖÖ¾ÍÊÇΪÁËÒԿռ任ȡʱ¼äµÄЧÂÊ,ÎÒÃÇÏÔʾµÄ½øÐÐÌî²¹¿Õ¼ä½øÐÐ¶ÔÆë,±ÈÈç:ÓÐÒ»ÖÖʹÓÿռ任ʱ¼ä×ö
·¨ÊÇÏÔʽµÄ²åÈëreserved³ÉÔ±£º

reserved³ÉÔ±¶ÔÎÒÃǵijÌÐòûÓÐʲôÒâÒå,ËüÖ»ÊÇÆðµ½Ìî²¹¿Õ¼äÒÔ´ïµ½×Ö½Ú¶ÔÆëµÄÄ¿µÄ,µ±È»¼´Ê¹²»¼ÓÕâ¸ö³ÉԱͨ³£±àÒëÆ÷Ò²»á¸øÎÒÃÇ×Ô¶¯Ìî²¹¶ÔÆë,ÎÒÃÇ×Ô¼º¼ÓÉÏËüÖ»ÊÇÆðµ½ÏÔʽµÄÌáÐÑ×÷ÓÃ.
2.4×Ö½Ú¶ÔÆë¿ÉÄÜ´øÀ´µÄÒþ»¼
´úÂëÖйØÓÚ¶ÔÆëµÄÒþ»¼£¬ºÜ¶àÊÇÒþʽµÄ¡£±ÈÈçÔÚÇ¿ÖÆÀàÐÍת»»µÄʱºò¡£ÀýÈç:

×îºóÁ½¾ä´úÂ룬´ÓÆæÊý±ß½çÈ¥·ÃÎÊunsignedshortÐͱäÁ¿£¬ÏÔÈ»²»·ûºÏ¶ÔÆëµÄ¹æ¶¨¡£
ÔÚx86ÉÏ£¬ÀàËÆµÄ²Ù×÷Ö»»áÓ°ÏìЧÂÊ£¬µ«ÊÇÔÚMIPS»òÕßsparcÉÏ£¬¿ÉÄܾÍÊÇÒ»¸öerror,ÒòΪËüÃÇÒªÇó±ØÐë×Ö½Ú¶ÔÆë.
Èç¹û³öÏÖ¶ÔÆë»òÕ߸³ÖµÎÊÌâÊ×ÏȲ鿴
1). ±àÒëÆ÷µÄbig little¶ËÉèÖÃ
2). ¿´ÕâÖÖÌåϵ±¾ÉíÊÇ·ñÖ§³Ö·Ç¶ÔÆë·ÃÎÊ
3). Èç¹ûÖ§³Ö¿´ÉèÖÃÁË¶ÔÆëÓë·ñ,Èç¹ûûÓÐÔò¿´·ÃÎÊʱÐèÒª¼ÓÄ³Ð©ÌØÊâµÄÐÞÊÎÀ´±êÖ¾ÆäÌØÊâ·ÃÎʲÙ×÷¡£
ARMÏÂµÄ¶ÔÆë´¦Àí
from DUI0067D_ADS1_2_CompLib type qulifiers
Óв¿·ÖÕª×ÔARM±àÒëÆ÷Îĵµ¶ÔÆë²¿·Ö¶ÔÆëµÄʹÓÃ:
1.__align(num)
Õâ¸öÓÃÓÚÐÞ¸Ä×î¸ß¼¶±ð¶ÔÏóµÄ×ֽڱ߽硣ÔÚ»ã±àÖÐʹÓÃLDRD»òÕßSTRDʱ¾ÍÒªÓõ½´ËÃüÁî__align(8)½øÐÐÐÞÊÎÏÞÖÆ¡£À´±£Ö¤Êý¾Ý¶ÔÏóÊÇÏàÓ¦¶ÔÆë¡£Õâ¸öÐÞÊζÔÏóµÄÃüÁî×î´óÊÇ8¸ö×Ö½ÚÏÞÖÆ,¿ÉÒÔÈÃ2×ֽڵĶÔÏó½øÐÐ4×Ö½Ú¶ÔÆë,µ«ÊDz»ÄÜÈÃ4×ֽڵĶÔÏó2×Ö½Ú¶ÔÆë¡£
__alignÊÇ´æ´¢ÀàÐÞ¸Ä,ËûÖ»ÐÞÊÎ×î¸ß¼¶ÀàÐͶÔÏó²»ÄÜÓÃÓڽṹ»òÕߺ¯Êý¶ÔÏó¡£
2.__packed
__packedÊǽøÐÐÒ»×Ö½Ú¶ÔÆë
l ²»ÄܶÔpackedµÄ¶ÔÏó½øÐÐ¶ÔÆë
l ËùÓжÔÏóµÄ¶Áд·ÃÎʶ¼½øÐÐ·Ç¶ÔÆë·ÃÎÊ
l float¼°°üº¬floatµÄ½á¹¹ÁªºÏ¼°Î´ÓÃ__packedµÄ¶ÔÏ󽫲»ÄÜ×Ö½Ú¶ÔÆë
l __packed¶Ô¾Ö²¿ÕûÐαäÁ¿ÎÞÓ°Ïì
l Ç¿ÖÆÓÉunpacked¶ÔÏóÏòpacked¶ÔÏóת»¯ÊÇ䶨Òå,ÕûÐÎÖ¸Õë¿ÉÒԺϷ¨¶¨
ÒåΪpacked¡£
__packed int* p; //__packed int ÔòûÓÐÒâÒå
2.5¶ÔÆë»ò·Ç¶ÔÆë¶Áд·ÃÎÊ´øÀ´ÎÊÌâ
__packed struct STRUCT_TEST
{char a;int b;char c;
} ;
//¶¨ÒåÈçϽṹ´ËʱbµÄÆðʼµØÖ·Ò»¶¨ÊDz»¶ÔÆëµÄ,ÔÚÕ»ÖзÃÎÊb¿ÉÄÜÓÐÎÊÌâ,ÒòΪջÉÏÊý¾Ý¿Ï¶¨ÊÇ¶ÔÆë·ÃÎÊ[from
CL]
//½«ÏÂÃæ±äÁ¿¶¨Òå³ÉÈ«¾Ö¾²Ì¬²»ÔÚÕ»ÉÏ
static char* p;static struct STRUCT_TEST a;void Main()
{
__packed int* q; //´Ëʱ¶¨Òå³É__packedÀ´ÐÞÊε±Ç°qÖ¸ÏòΪ·Ç¶ÔÆëµÄÊý¾ÝµØÖ·ÏÂÃæµÄ·ÃÎÊÔò¿ÉÒÔ
p = (char*)&a;
q = (int*)(p+1);
*q = 0x87654321; /*
µÃµ½¸³ÖµµÄ»ã±àÖ¸ÁîºÜÇå³þ
ldr r5,0x20001590 ; = #0x12345678
[0xe1a00005] mov r0,r5
[0xeb0000b0] bl __rt_uwrite4 //ÔÚ´Ë´¦µ÷ÓÃÒ»¸öд4byteµÄ²Ù×÷º¯Êý
[0xe5c10000] strb r0,[r1,#0] //º¯Êý½øÐÐ4´Îstrb²Ù×÷È»ºó·µ»Ø±£Ö¤ÁËÊý¾ÝÕýÈ·µÄ·ÃÎÊ
[0xe1a02420] mov r2,r0,lsr #8
[0xe5c12001] strb r2,[r1,#1]
[0xe1a02820] mov r2,r0,lsr #16
[0xe5c12002] strb r2,[r1,#2]
[0xe1a02c20] mov r2,r0,lsr #24
[0xe5c12003] strb r2,[r1,#3]
[0xe1a0f00e] mov pc,r14
*/ /*
Èç¹ûqûÓмÓ__packedÐÞÊÎÔò»ã±à³öÀ´Ö¸ÁîÊÇÕâÑùÖ±½Ó»áµ¼ÖÂÆæµØÖ·´¦·ÃÎÊʧ°Ü
[0xe59f2018] ldr r2,0x20001594 ; = #0x87654321
[0xe5812000] str r2,[r1,#0]
*/
//ÕâÑù¿ÉÒÔºÜÇå³þµÄ¿´µ½·Ç¶ÔÆë·ÃÎÊÊÇÈçºÎ²úÉú´íÎóµÄ
//ÒÔ¼°ÈçºÎÏû³ý·Ç¶ÔÆë·ÃÎÊ´øÀ´ÎÊÌâ
//Ò²¿ÉÒÔ¿´µ½·Ç¶ÔÆë·ÃÎÊºÍ¶ÔÆë·ÃÎʵÄÖ¸Áî²îÒìµ¼ÖÂЧÂÊÎÊÌâ
|