2012年4月3日 星期二

word alignment(pragma pack) --- 影響struct size的因素

struct syskeyd2
{
int a;
int b;
int c;
int d;
};
/*因為預設是32 bits定址,所以char c;佔4bytes, char d;也佔4bytes*/
struct syskeyd1
{
int a;
char c;
int b;
char d;
int e;
};
/*如果我把char c;跟char d;放在一起,那這c跟d就會一起進到4bytes裡,
結果sizeof(struct syskeyd1)會是16 bytes*/


/*以下做完pack()後, struct就會以1個個bytes去計算size跟參數定位*/
#if defined(_MSC_VER)

#define HANDLE_PRAGMA_PACK_PUSH_POP //WIN32 style pack
#elif defined(__BORLANDC__)
#define HANDLE_PRAGMA_PACK_PUSH_POP //WIN32 style pack
#else
#endif
#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
#pragma pack(push,1)
#else
#pragma pack(1)
#endif
struct syskeyd3
{
int a;
char c;
int b;
char d;
int e;
};
#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
#pragma pack(pop)
#else
#pragma pack()
#endif
/*****************************************************************************/
/* NAME : main() */
/*****************************************************************************/
main(int argc, char *argv[])
{
printf("syskeyd2[%d] syskeyd1[%d] syskeyd3[%d] \n",sizeof(struct syskeyd2), sizeof(struct syskeyd1),sizeof(struct syskeyd3));
return 0;
}


執行結果:
syskeyd2[16] syskeyd1[20] syskeyd3[14]

沒有留言:

張貼留言

文章分類