skyilyskyily.blog.chinaunix.net
skyily
全部博文(144)
2010年(16)
2009年(128)
Zane_Yu
tasteswe
zwrvvv
xiao888l
zimuqing
leilelei
Phyllis6
jonathan
denghai1
wbdwbd04
itTangze
lifj1234
18141908
AAABug
分类: LINUX
2009-10-13 14:13:37
对 sizeof 和 #pragma pack(n) 的认识今天在rukia的空间看到关于 sizeof 和 #pragma pack(n) 的文章,发现自己在这一方面上没有弄懂。有这个必要把它完全搞明白。所以就到网上看了一些文章,自己也做了一些测试。以下是我的心得。以下都是在32位的PC上 VC6.0 上得到。sizeof 是用来求一个变量或一种类型占用多少个Byte. (32位PC)sizeof(bool) = 1 sizeof(char) = 1sizeof(short) = 2 sizeof(int) = 4;sizeof(float) = 4 sizeof(double) = 8;sizeof(指针) = 4#pragma pack(n) 是用来确定编译时的字节对齐方式, 默认为 #pragma pack(sizeof(int))。当n大于sizeof(int)的效果跟 n=sizeof(int)是一样的。 接下来对结构体进行分析。* 当结构体中最长宽度的数据成员的宽度小于 n 时,按该成员宽度对齐;* 当最长宽度的数据成员的宽度大于或等于 n 时,按 n 对齐。 struct TEST{char a;}#pragram pack(1) 对齐长度 1 内存布局 '1' sizeof(TEST) = 1#pragram pack(2) 对齐长度 1 内存布局 '1' sizeof(TEST) = 1#pragram pack(4) 对齐长度 1 内存布局 '1' sizeof(TEST) = 1struct TEST{char a;short b;}#pragram pack(1) 对齐长度 1 内存布局 1,11 sizeof(TEST) = 3#pragram pack(2) 对齐长度 2 内存布局 1*,11 sizeof(TEST) = 4#pragram pack(4) 对齐长度 2 内存布局 1*,11 sizeof(TEST) = 4struct TEST{char a;short b;char c;}#pragram pack(1) 对齐长度 1 内存布局 1,11,1 sizeof(TEST) = 4#pragram pack(2) 对齐长度 2 内存布局 1*,11,1* sizeof(TEST) = 6#pragram pack(4) 对齐长度 2 内存布局 1*,11,1* sizeof(TEST) = 6struct TEST{char a;int b;short c;}#pragram pack(1) 对齐长度 1 内存布局 1,1111,11 sizeof(TEST) = 7#pragram pack(2) 对齐长度 2 内存布局 1*,1111,11 sizeof(TEST) = 8#pragram pack(4) 对齐长度 4 内存布局 1***,1111,11** sizeof(TEST) = 12从这些例子可以看出,当n取值越小,结构体所占的内存空间就越小。不过这也会带来一个问题,访问这些数据所花的时间也变长了。^_^这样的问题在实际编程中一般不会遇到。一般在考试中或某些公司的面试笔试中才会出现。
上一篇:Linux下构建 MIPS 交叉编译器
下一篇:细说 #pragma pack(n) [转]
登录 注册