truct rf {
unsigned short rh_zero;
float rh_sps;
}ss;
int s;
s=sizeof(ss);
sµÈÓÚ¶àÉÙ.
¶¥¿ÍchengdzÓÚWed Sep 26 19:48:59 2007¶¥ÌûÒ»´Î
16+32 =48
¶¥¿ÍyilingÓÚThu Sep 27 15:24:00 2007¶¥ÌûÒ»´Î
ÕâÊÇÒ»¸ö¹ØÓÚÄÚ´æ¶ÔÆëµÄÎÊÌâ.
ÀíÂÛÉÏ˵ÊÇ2+4=6;
ÊܱàÒëÆ÷ÉèÖÃÇé¿ö.
Ò²¿ÉÄÜÊÇ8,»ò26,»ò....
¶¥¿ÍyilingÓÚSat Sep 29 20:37:22 2007¶¥ÌûÒ»´Î
#pragma pack(16)
class dd{
int a;
virtual ~dd(){}
double c;
virtual out(){}
};
#pragma pack()
ÄÚ´æÖÐÐÎʽÈçÏÂ:
vptr:4×Ö½Ú
int:4×Ö½Ú
double 8×Ö½Ú,ËüÃÇÖ®¼ä¸ÕºÃ²»ÓÃÌî³äÊý¾Ý,ÔÚ½áβҲ²»ÓÃÌî,ËùÒÔ
ÊÇ16,¿ÉÒÔÖ´Ðнá¹ûÊÇ24!
ËüΪʲô²»ÊÇ16¶øÊÇ24ÄØ?
Èç¹ûÎÒ½«#pragma pack(16)
¸ÄÕýΪ#pragma pack(8),ÄÇô,ËüµÄ´óС»áÊÇ16,µ«ÊÇÊÂʵÉÏ»¹ÊÇ24,ÎªÊ²Ã´ÄØ?
#pragma pack(n)
Õâ¸önµÄÖµ¿ÉÒÔΪ1, 2, 4, 8, 16£¬packµÄÔÔòÊǾ¡Á¿Ê¹ÆäÔÚÄÚ´æÖкͻúÆ÷µÄ×ÔÈ»×Ö³¤Ïàͬ
£¬ÄãµÄ»úÆ÷×ÔÈ»×Ö³¤¿ÉÄÜÊÇ2×ÖÒ²¾ÍÊÇ4×Ö½Ú£¬ËùÒÔµ±n > 4ʱ£¬×Ö½ÚÊýСÓÚ4µÄÀàÐͻᱻ×Ô
¶¯Ìî³äΪ4×Ö½Ú£¬´óÓÚ4×ֽڵIJŸù¾ÝnµÄÖ¸¶¨À´Ìî³ä£¬ËùÒÔÄãÄǸöÀàµÄÄÚ´æÅÅÁз½Ê½Ó¦¸ÃÊÇ
ÕâÑù£º
vptr: 4, int 4, double 16;
ÎÒ¿¼ÂǹýÊÇ·ñÊDZàÒëÆ÷ÓÅ»¯µÄ½á¹û£¬µ«ÎÒ¿´ÁËÏ·¢ÏÖÎҵıàÒëÆ÷ÓÅ»¯ÊDZ»¹ØµôµÄ£¬¶øÇÒst
ructºÍclasµÄ¶ÔÆë·½Ê½ÊÇĬÈÏdefault£¬ËùÒԵóöÒÔÉϽáÂÛ£¬½ö¹©²Î¿¼!
ÊÜÄãÎÊÌâµÄÆô·¢£¬Õ⼸Ñо¿ÁËϼÆËã»ú×é³ÉÔÀí£¬ÆäÖп´ÁËÒ»±¾Êé½ÐWrite Great Code V
ol1¡ª¡ªUnderstanding The Machine£¬ÔÚÄÚ´æ½á¹¹ÄÇÕÂÓÐÕâôһ¶Î£º
Figure 7-8 also suggests that compilers pack the fields into adjacent memory l
ocations with no gaps between the fields. While this is true for many language
s, this certainly isn t the most common memory organization for a record. For
performance reasons, most compilers will actually align the fields of a record
on appropriate memory boundaries. The exact details vary by language, compile
r implementation, and CPU, but a typical compiler will place fields at an offs
et within the record s storage area that is natural for that particular fiel
d s data type. On the 80x86, for example, compilers that follow the Intel ABI
(application binary interface) will allocate one-byte objects at any offset wi
thin the record, words only at even offsets, and double-word or larger objects
on double-word boundaries. Although not all 80x86 compilers support the Intel
ABI, most do, which allows records to be shared among functions and procedure
s written in different languages on the 80x86. Other CPU manufacturers provide their own ABI for their processors and programs that adhere to
an ABI can share binary data at run time with other programs that adhere to t
he same ABI.
˵µÄÊǹØÓڽṹÌåÖÐÊý¾ÝµÄ¶ÔÆë·½Ê½ÒòÓïÑÔ¡¢±àÒëÆ÷ºÍCPU¶øÒ죬µ«ÊÇͨ³£µÄ×ö·¨¾ÍÊǰÑÊý
¾Ý³ÉÔ±·ÅÖÃÔÚÓë¸Ã³ÉÔ±µÄÀàÐͽÏΪ·ûºÏ£¨Ò²³Æ×ÔÈ»·ÅÖ㩵ĵط½¡£
ÒòΪIntelµÄ Pentium ϵÁд¦ÀíÆ÷ÊôÓÚx86¼Ò×壬x86¼Ò×åÖУº
8088, 8086, 80186, 80188 Ö»ÓÐ20ÌõÊý¾Ý×ÜÏߣ¬Ñ°Ö·ÄÜÁ¦Îª1M
80286, 80386sx ÓÐ24ÌõÊý¾Ý×ÜÏß ¿ÉѰַ16M
80386dx ÓÐ32ÌõÊý¾Ý×ÜÏß ¿ÉѰַ4GB
80486, Pentium Ò²ÊÇ32Ìõ Ѱַ4GB
Pentium Pro, II, III, IV ÓÐ36ÌõÊý¾Ý×ÜÏß ¿ÉѰַ64GB
P4Ó¦¸ÃÊôÓÚPrntium Pro£¬ÓÐ36ÌõÊý¾Ý×ÜÏߣ¬ÎÒµÄÒ²ÊÇP42.4G£¬µ«x86¼Ò×åµÄͨÓÃÕûÐͼĴæ
Æ÷ÊÇ32λµÄ£¬Ò²¾ÍÊÇÔÚÿ¸öCPUʱÖÓÖÜÆÚÖÐ×î¶àÕâÄÜ´¦Àí32λÊý¾Ý¡£
Ò»°ãËù˵µÄ32£¬64λCPU¶¼Ö¸µÄÊÇÆäÊý¾Ý×ÜÏßÊýÁ¿£¬¶ø²»ÊÇCPU¼Ä´æÆ÷ËùÒÔP4ÊÇÊôÓÚ32λµÄ
´¦ÀíÆ÷(ÒÔºóÂòCPUÒª¿´¼Ä´æÆ÷´óС²»Òª±»±íÃæµÄ32, 64ÔÆÔÆ£¬¸øÃÉÀ²...)
ËùÒÔPentium Pro¶à³öÀ´µÄÄÇ4Ìõ×ÜÏßPÓÃûÓУ¡
ÒòΪÓÐ32ÌõÄÜÓõ½µÄÊý¾Ý×ÜÏߣ¬ËùÒÔÿ¸öcpuÖ¸Áî¿É²Ù×÷µÄ¶ÔÏó×î´ó¿ÉÄܾÍΪ32bit£¬¼´8¸ö
룬x86¼Ò×å²ÉÓÃ2¸ömemory bank±íʾһ¸ö×Ö£¬ËùÒÔ32λÊý¾Ý×ÜÏß¿ÉÓÉ4¸öbankÀ´±íʾ£¬Ëù
ÒÔÆäÄÚ²¿ÄÚ´æÄ£ÐÍΪ£º
QW: quad-word
.^
.|
.|
QWX2: XX XX XX XX // ´Ó×óÍùÓÒÒÀ´ÎÊÇbank 1, 2, 3, 4
QWX1: XX XX XX XX // 8λ X±íÊý¾Ýδ֪
QWX0: XX XX XX XX // 8λ bankÖеÄÿ¸öX±íʾһ¸öλ
.|
.|µØÖ·ÓÉÏÂÍùÉÏÔö
.
// ÓұߵÄÊý×Öÿһ¸ö±íʾһ¸öλ
¶øx86CPU¶Ô´ò°üÊý¾ÝÌå(½á¹¹£¬ÁªºÏ£¬ÕâÀïÁªºÏ±»Åųý)ÖеÄÊý¾ÝÀàÐ͵ÄÅÅÁз½Ê½ÊÇ×ñÑÒÔ
ÏÂÔÔòµÄ£º
1¡¢Compiler will allocate one-byte objects at any offset within the record.
±àÒëÆ÷½«Ôڽṹ»ùµØÖ·µÄÈÎÒâÆ«ÒÆÁ¿´¦·ÖÅä1×Ö½Ú£¨Õâ¾ÍÊÇΪʲô´´½¨Ò»¸ö¿ÕÀàÒ²Õ¼1×Ö½Ú
µÄÔÒò£©¡£
2¡¢Words only at even offsets¡£
×ÖÖ»´¦ÔÚÆ«ÒÆÁ¿ÎªÅ¼ÊýµÄµØ·½¡£
3¡¢Double-word or larger objects on double-word boundaries.
Ë«×Ö»ò¸ü´óµÄÊý¾ÝÌåÖ»´¦ÔÚË«×ֵıßÔµÉÏ¡£
ÒÔÉÏÊÇÎÒ¿´µ½µÄÒ»µãÐĵã¬Ó¦¸ÃÊÇIntel´¦ÀíÆ÷ºÍ´ó²¿·Ö±àÒëÆ÷µÄĬÈÏ´¦Àí·½Ê½£¬¸øÄã·ÖÏí
Ï¡£
ÁíÍâÎÒÓÖÊÔÑéÁËÒÔºó·¢ÏÖ¾¹È»ÊÇVCµÄÎÊÌ⣬ÎÒÔÚ³ýVCÍâµÄÆäËû¼¸¸ö±àÒëÆ÷ÉÏÊÔÑéµÄ½á¹û¶¼
ÊÇ16룬¶ÔÆëÔÔòºÍÎÒ¸úÄã˵µÄÒ»Ñù£¬VCΪʲôÊÇ24ÄØ£¿ÒòΪËü±àÒëÆ÷ÀïµÄĬÈÏ¶ÔÆë·½Ê½
ÊÇ8×Ö½Ú£¬Çë¿´ÒÔϽá¹û£º
#include <iostream>
using namespace std;
//#pragma pack()
class dd{
public:
int a;
double c;
virtual ~dd(){}
}a, b;
int main()
{
cout << &a << endl;
cout << &a.a << endl;
cout << &a.c << endl;
cout << &b;
}
ÔËÐнá¹ûÊÇ
0041E008 // vptr
0041E010 // int
0041E018 // double
0041E020
ÄÚ´æÄ£ÐÍ¿ÉÄܾÍÊÇÕâÑù£º
X: Ìî³ä×Ö½Ú
.^
.|
.|
QWX2: HH HH HH HH // double
QWX1: XX XX BB BB // int
QWX0: XX XX AA AA // vptr
.|
.|µØÖ·ÓÉÏÂÍùÉÏÔö
.|
ËùÒÔÊÇ3*8 = 24×Ö½Ú
¿É¼û±àÒëÆ÷°ÑvptrÒ²·ÖÅäΪÁË8×Ö½Ú£¬¿ÉÄÜÓÐ4×Ö½ÚµÄÌî³ä£¬ÔÒòÎÒÏëºÜ¼òµ¥£¬¾ÍÊÇVCÓºÏ
32λ¼Ä´æÆ÷µÄCPUµÄ½á¹û£¬ÒòΪÕâÑù¾Í¿ÉÒÔÿ´Î¶ÁÈ¡µÄ×î´ó32λÊý¾Ý¶¼¿ÉÒÔÔÚÒ»¸ö32λµÄͨ
ÓÃÕûÐͼĴæÆ÷ÖÐÀ´Ö´ÐвÙ×÷£¬Ö»ÐèÒªÒ»¸öÖ¸Áî¾Í¿ÉÒÔ°ÑÊý¾Ý·ÖÀë³öÀ´£¬¶øÈç¹ûÊÇÒÔ4×Ö½Ú¶Ô
ÆëµÄ»°£¬¾ÍÐèÒª2¸öÖ¸ÁÏȰѼĴæÆ÷Öеĸß16루ÓÉÓÚintelÊÇ·´×Å´æµÄ£©¶ÁÈë16λͨÓÃ
ÕûÐͼĴæÆ÷£¨AX£¬BX£¬CX£¬DX£©£¬ÔÙ°ÑÊý¾ÝÌáÈ¡³öÀ´¡£
ÕâÑùµÄ½á¹ûÊÇÔö¼ÓÁ˳ÌÐòÖ´ÐеÄÄڴ濪Ïú£¬µ«Ìá¸ßÁËÖ´ÐÐËÙ¶È£¬µäÐ͵ÄÎþÉü¿Õ¼ä»»È¡Ê±¼ä
µÄ×ö·¨£¨Ã²ËÆÏÖÔÚ¶¼ÒÔʱ¼äΪÓÅÏÈ¿¼ÂÇ£¬¼ÆËã»úµÄRAMÊÇÔ½À´Ô½´ó£¬¾ÍÁ¬cache¶¼Óкü¸¼¶
´óµ½ÊýMÁË-_-~£©¡£
µ«ÔÚÆäËûµÄ±àÒëÆ÷ÉϲúÉúµÄ½á¹û¾ÍÊÇ16£¬×ÜÖ®#pragma ºêµÄʵÏÖ±¾À´¾ÍÊÇ×î²»¿É¿¿µÄ£¬Òò
ΪºÜ´ó³Ì¶ÈÉÏËüµÄʵÏÖÊÇÈ¡¾öÓë±àÒëÆ÷ºÍCPU£¬ËùÒÔÓöµ½ÕâÑùµÄÎÊÌ⻹ÊÇÒª½áºÏ¶à·½Ã濼ÂÇ
£¬ÁíÍâ¶àÎüÊÕһЩ¼ÆËã»ú½á¹¹µÄµ×²ã֪ʶҲÄܰïÖú×Ô¼ºµÄÀí½â£¨Ëµ¡°°ïÖú¡±Óеãǣǿ£¬Òò
ΪÁ˽âÁ˵ײãʵÏÖÄÇ»¹ÓÐʲô¸ß¼¶¡°»¨ÕС±ÄܺöÓÆµÃÁËÎÒµÄ^_^£©¡£
PS: ¶àлÄãµÄÕâ¸öÎÊÌâ°¡ºÇºÇ£¬ÎÒÕâ¶Îʱ¼ä¶ÁÁË3±¾¼ÆËã»ú½á¹¹µÄÊ飬¶Ôµ×²ãÓÐÁËÒ»¶¨Á˽â
£¬½ñºó´òËã°ÑIntelµÄ3±¾Developer manualÒ²¸ã¶¨£¬¹þ¹þ¹ýñ«£¡£¡
ÔÚ×î½üµÄÏîÄ¿ÖУ¬ÎÒÃÇÉæ¼°µ½ÁË¡°ÄÚ´æ¶ÔÆë¡±¼¼Êõ¡£¶ÔÓڴ󲿷ֳÌÐòÔ±À´Ëµ£¬¡°ÄÚ´æ¶ÔÆë
¡±¶ÔËûÃÇÀ´Ëµ¶¼Ó¦¸ÃÊÇ¡°Í¸Ã÷µÄ¡±¡£¡°ÄÚ´æ¶ÔÆë¡±Ó¦¸ÃÊDZàÒëÆ÷µÄ¡°¹ÜϽ·¶Î§¡±¡£±àÒëÆ÷
Ϊ³ÌÐòÖеÄÿ¸ö¡°Êý¾Ýµ¥Ôª¡±°²ÅÅÔÚÊʵ±µÄλÖÃÉÏ¡£µ«ÊÇCÓïÑÔµÄÒ»¸öÌØµã¾ÍÊÇÌ«Áé»î£¬Ì«
Ç¿´ó£¬ËüÔÊÐíÄã¸ÉÔ¤¡°ÄÚ´æ¶ÔÆë¡±¡£Èç¹ûÄãÏëÁ˽â¸ü¼Óµ×²ãµÄÃØÃÜ£¬¡°ÄÚ´æ¶ÔÆë¡±¶ÔÄã¾Í
²»Ó¦¸ÃÔÙ͸Ã÷ÁË¡£
Ò»¡¢ÄÚ´æ¶ÔÆëµÄÔÒò
´ó²¿·ÖµÄ²Î¿¼×ÊÁ϶¼ÊÇÈçÊÇ˵µÄ£º
1¡¢Æ½Ì¨ÔÒò(ÒÆÖ²ÔÒò)£º²»ÊÇËùÓеÄÓ²¼þƽ̨¶¼ÄÜ·ÃÎÊÈÎÒâµØÖ·ÉϵÄÈÎÒâÊý¾ÝµÄ£»Ä³Ð©Ó²
¼þƽֻ̨ÄÜÔÚijЩµØÖ·´¦È¡Ä³Ð©Ìض¨ÀàÐ͵ÄÊý¾Ý£¬·ñÔòÅ׳öÓ²¼þÒì³£¡£
2¡¢ÐÔÄÜÔÒò£ºÊý¾Ý½á¹¹(ÓÈÆäÊÇÕ»)Ó¦¸Ã¾¡¿ÉÄܵØÔÚ×ÔÈ»±ß½çÉÏ¶ÔÆë¡£ÔÒòÔÚÓÚ£¬ÎªÁË·ÃÎÊ
δ¶ÔÆëµÄÄڴ棬´¦ÀíÆ÷ÐèÒª×÷Á½´ÎÄÚ´æ·ÃÎÊ£»¶ø¶ÔÆëµÄÄÚ´æ·ÃÎʽöÐèÒªÒ»´Î·ÃÎÊ¡£
¶þ¡¢¶ÔÆë¹æÔò
ÿ¸öÌØ¶¨Æ½Ì¨ÉϵıàÒëÆ÷¶¼ÓÐ×Ô¼ºµÄĬÈÏ¡°¶ÔÆëϵÊý¡±(Ò²½Ð¶ÔÆëÄ£Êý)¡£³ÌÐòÔ±¿ÉÒÔͨ¹ý
Ô¤±àÒëÃüÁî#pragma pack(n)£¬n=1,2,4,8,16À´¸Ä±äÕâһϵÊý£¬ÆäÖеÄn¾ÍÊÇÄãÒªÖ¸¶¨µÄ¡°
¶ÔÆëϵÊý¡±¡£
¹æÔò£º
1¡¢Êý¾Ý³ÉÔ±¶ÔÆë¹æÔò£º½á¹¹(struct)(»òÁªºÏ(union))µÄÊý¾Ý³ÉÔ±£¬µÚÒ»¸öÊý¾Ý³ÉÔ±·ÅÔÚ
offsetΪ0µÄµØ·½£¬ÒÔºóÿ¸öÊý¾Ý³ÉÔ±µÄ¶ÔÆë°´ÕÕ#pragma packÖ¸¶¨µÄÊýÖµºÍÕâ¸öÊý¾Ý³ÉÔ±
×ÔÉí³¤¶ÈÖУ¬±È½ÏСµÄÄǸö½øÐС£
2¡¢½á¹¹(»òÁªºÏ)µÄÕûÌå¶ÔÆë¹æÔò£ºÔÚÊý¾Ý³ÉÔ±Íê³É¸÷×Ô¶ÔÆëÖ®ºó£¬½á¹¹(»òÁªºÏ)±¾ÉíÒ²Òª
½øÐÐ¶ÔÆë£¬¶ÔÆë½«°´ÕÕ#pragma packÖ¸¶¨µÄÊýÖµºÍ½á¹¹(»òÁªºÏ)×î´óÊý¾Ý³ÉÔ±³¤¶ÈÖУ¬±È
½ÏСµÄÄǸö½øÐС£
3¡¢½áºÏ1¡¢2¿ÅÍÆ¶Ï£ºµ±#pragma packµÄnÖµµÈÓÚ»ò³¬¹ýËùÓÐÊý¾Ý³ÉÔ±³¤¶ÈµÄʱºò£¬Õâ¸önÖµ
µÄ´óС½«²»²úÉúÈκÎЧ¹û¡£
Èý¡¢ÊÔÑé
ÎÒÃÇͨ¹ýһϵÁÐÀý×ÓµÄÏêϸ˵Ã÷À´Ö¤Ã÷Õâ¸ö¹æÔò°É!
ÎÒÊÔÑéÓõıàÒëÆ÷°üÀ¨GCC 3.4.2ºÍVC6.0µÄC±àÒëÆ÷£¬Æ½Ì¨ÎªWindows XP + Sp2¡£
ÎÒÃǽ«ÓõäÐ͵Ästruct¶ÔÆëÀ´ËµÃ÷¡£Ê×ÏÈÎÒÃǶ¨ÒåÒ»¸östruct£º
#pragma pack(n) /* n = 1, 2, 4, 8, 16 */
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack(n)
Ê×ÏÈÎÒÃÇÊ×ÏÈÈ·ÈÏÔÚÊÔÑéÆ½Ì¨Éϵĸ÷¸öÀàÐ͵Äsize£¬¾ÑéÖ¤Á½¸ö±àÒëÆ÷µÄÊä³ö¾ùΪ£º
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
ÎÒÃǵÄÊÔÑé¹ý³ÌÈçÏ£ºÍ¨¹ý#pragma pack(n)¸Ä±ä¡°¶ÔÆëϵÊý¡±£¬È»ºó²ì¿´sizeof(struct
test_t)掙歜
1¡¢1×Ö½Ú¶ÔÆë(#pragma pack(1))
Êä³ö½á¹û£ºsizeof(struct test_t) = 8 [Á½¸ö±àÒëÆ÷Êä³öÒ»ÖÂ]
·ÖÎö¹ý³Ì£º
1) ³ÉÔ±Êý¾Ý¶ÔÆë
#pragma pack(1)
struct test_t {
int a; /* ³¤¶È4 < 1 °´1¶ÔÆë£»Æðʼoffset=0 0%1=0£»´æ·ÅλÖÃÇø¼ä[0,3] */
char b; /* ³¤¶È1 = 1 °´1¶ÔÆë£»Æðʼoffset=4 4%1=0£»´æ·ÅλÖÃÇø¼ä[4] */
short c; /* ³¤¶È2 > 1 °´1¶ÔÆë£»Æðʼoffset=5 5%1=0£»´æ·ÅλÖÃÇø¼ä[5,6] */
char d; /* ³¤¶È1 = 1 °´1¶ÔÆë£»Æðʼoffset=7 7%1=0£»´æ·ÅλÖÃÇø¼ä[7] */
};
#pragma pack()
³ÉÔ±×Ü´óС=8
2) ÕûÌå¶ÔÆë
ÕûÌå¶ÔÆëϵÊý = min((max(int,short,char), 1) = 1
ÕûÌå´óС(size)=$(³ÉÔ±×Ü´óС) °´ $(ÕûÌå¶ÔÆëϵÊý) Ô²Õû = 8 /* 8%1=0 */ [×¢1]
2¡¢2×Ö½Ú¶ÔÆë(#pragma pack(2))
Êä³ö½á¹û£ºsizeof(struct test_t) = 10 [Á½¸ö±àÒëÆ÷Êä³öÒ»ÖÂ]
·ÖÎö¹ý³Ì£º
1) ³ÉÔ±Êý¾Ý¶ÔÆë
#pragma pack(2)
struct test_t {
int a; /* ³¤¶È4 > 2 °´2¶ÔÆë£»Æðʼoffset=0 0%2=0£»´æ·ÅλÖÃÇø¼ä[0,3] */
char b; /* ³¤¶È1 < 2 °´1¶ÔÆë£»Æðʼoffset=4 4%1=0£»´æ·ÅλÖÃÇø¼ä[4] */
short c; /* ³¤¶È2 = 2 °´2¶ÔÆë£»Æðʼoffset=6 6%2=0£»´æ·ÅλÖÃÇø¼ä[6,7] */
char d; /* ³¤¶È1 < 2 °´1¶ÔÆë£»Æðʼoffset=8 8%1=0£»´æ·ÅλÖÃÇø¼ä[8] */
};
#pragma pack()
³ÉÔ±×Ü´óС=9
2) ÕûÌå¶ÔÆë
ÕûÌå¶ÔÆëϵÊý = min((max(int,short,char), 2) = 2
ÕûÌå´óС(size)=$(³ÉÔ±×Ü´óС) °´ $(ÕûÌå¶ÔÆëϵÊý) Ô²Õû = 10 /* 10%2=0 */
3¡¢4×Ö½Ú¶ÔÆë(#pragma pack(4))
Êä³ö½á¹û£ºsizeof(struct test_t) = 12 [Á½¸ö±àÒëÆ÷Êä³öÒ»ÖÂ]
·ÖÎö¹ý³Ì£º
1) ³ÉÔ±Êý¾Ý¶ÔÆë
#pragma pack(4)
struct test_t {
int a; /* ³¤¶È4 = 4 °´4¶ÔÆë£»Æðʼoffset=0 0%4=0£»´æ·ÅλÖÃÇø¼ä[0,3] */
char b; /* ³¤¶È1 < 4 °´1¶ÔÆë£»Æðʼoffset=4 4%1=0£»´æ·ÅλÖÃÇø¼ä[4] */
short c; /* ³¤¶È2 < 4 °´2¶ÔÆë£»Æðʼoffset=6 6%2=0£»´æ·ÅλÖÃÇø¼ä[6,7] */
char d; /* ³¤¶È1 < 4 °´1¶ÔÆë£»Æðʼoffset=8 8%1=0£»´æ·ÅλÖÃÇø¼ä[8] */
};
#pragma pack()
³ÉÔ±×Ü´óС=9
2) ÕûÌå¶ÔÆë
ÕûÌå¶ÔÆëϵÊý = min((max(int,short,char), 4) = 4
ÕûÌå´óС(size)=$(³ÉÔ±×Ü´óС) °´ $(ÕûÌå¶ÔÆëϵÊý) Ô²Õû = 12 /* 12%4=0 */
4¡¢8×Ö½Ú¶ÔÆë(#pragma pack(8))
Êä³ö½á¹û£ºsizeof(struct test_t) = 12 [Á½¸ö±àÒëÆ÷Êä³öÒ»ÖÂ]
·ÖÎö¹ý³Ì£º
1) ³ÉÔ±Êý¾Ý¶ÔÆë
#pragma pack(8)
struct test_t {
int a; /* ³¤¶È4 < 8 °´4¶ÔÆë£»Æðʼoffset=0 0%4=0£»´æ·ÅλÖÃÇø¼ä[0,3] */
char b; /* ³¤¶È1 < 8 °´1¶ÔÆë£»Æðʼoffset=4 4%1=0£»´æ·ÅλÖÃÇø¼ä[4] */
short c; /* ³¤¶È2 < 8 °´2¶ÔÆë£»Æðʼoffset=6 6%2=0£»´æ·ÅλÖÃÇø¼ä[6,7] */
char d; /* ³¤¶È1 < 8 °´1¶ÔÆë£»Æðʼoffset=8 8%1=0£»´æ·ÅλÖÃÇø¼ä[8] */
};
#pragma pack()
³ÉÔ±×Ü´óС=9
2) ÕûÌå¶ÔÆë
ÕûÌå¶ÔÆëϵÊý = min((max(int,short,char), 8) = 4
ÕûÌå´óС(size)=$(³ÉÔ±×Ü´óС) °´ $(ÕûÌå¶ÔÆëϵÊý) Ô²Õû = 12 /* 12%4=0 */
5¡¢16×Ö½Ú¶ÔÆë(#pragma pack(16))
Êä³ö½á¹û£ºsizeof(struct test_t) = 12 [Á½¸ö±àÒëÆ÷Êä³öÒ»ÖÂ]
·ÖÎö¹ý³Ì£º
1) ³ÉÔ±Êý¾Ý¶ÔÆë
#pragma pack(16)
struct test_t {
int a; /* ³¤¶È4 < 16 °´4¶ÔÆë£»Æðʼoffset=0 0%4=0£»´æ·ÅλÖÃÇø¼ä[0,3] */
char b; /* ³¤¶È1 < 16 °´1¶ÔÆë£»Æðʼoffset=4 4%1=0£»´æ·ÅλÖÃÇø¼ä[4] */
short c; /* ³¤¶È2 < 16 °´2¶ÔÆë£»Æðʼoffset=6 6%2=0£»´æ·ÅλÖÃÇø¼ä[6,7] */
char d; /* ³¤¶È1 < 16 °´1¶ÔÆë£»Æðʼoffset=8 8%1=0£»´æ·ÅλÖÃÇø¼ä[8] */
};
#pragma pack()
³ÉÔ±×Ü´óС=9
2) ÕûÌå¶ÔÆë
ÕûÌå¶ÔÆëϵÊý = min((max(int,short,char), 16) = 4
ÕûÌå´óС(size)=$(³ÉÔ±×Ü´óС) °´ $(ÕûÌå¶ÔÆëϵÊý) Ô²Õû = 12 /* 12%4=0 */
ËÄ¡¢½áÂÛ
8×Ö½ÚºÍ16×Ö½Ú¶ÔÆëÊÔÑéÖ¤Ã÷ÁË¡°¹æÔò¡±µÄµÚ3µã£º¡°µ±#pragma packµÄnÖµµÈÓÚ»ò³¬¹ýËùÓÐ
Êý¾Ý³ÉÔ±³¤¶ÈµÄʱºò£¬Õâ¸önÖµµÄ´óС½«²»²úÉúÈκÎЧ¹û¡±¡£ÁíÍâÄÚ´æ¶ÔÆëÊǸöºÜ¸´ÔӵĶ«
Î÷£¬ÉÏÃæËù˵µÄÔÚÓÐЩʱºòÒ²¿ÉÄܲ»ÕýÈ·¡£ºÇºÇ^_^
[×¢1]
ʲôÊÇ¡°Ô²Õû¡±£¿
¾ÙÀý˵Ã÷£ºÈçÉÏÃæµÄ8×Ö½Ú¶ÔÆëÖеġ°ÕûÌå¶ÔÆë¡±£¬ÕûÌå´óС=9 °´ 4 Ô²Õû = 12
Ô²ÕûµÄ¹ý³Ì£º´Ó9¿ªÊ¼Ã¿´Î¼ÓÒ»£¬¿´ÊÇ·ñÄܱ»4Õû³ý£¬ÕâÀï9£¬10£¬11¾ù²»Äܱ»4Õû³ý£¬µ½12
ʱ¿ÉÒÔ£¬ÔòÔ²Õû½áÊø¡£
|