Chinaunix首页 | 论坛 | 博客
  • 博客访问: 611689
  • 博文数量: 144
  • 博客积分: 5037
  • 博客等级: 大校
  • 技术积分: 1581
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-30 21:49
文章存档

2010年(16)

2009年(128)

分类: 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) = 1
sizeof(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) = 1

struct 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) = 4

struct 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) = 6

struct 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取值越小,结构体所占的内存空间就越小。
不过这也会带来一个问题,访问这些数据所花的时间也变长了。^_^
这样的问题在实际编程中一般不会遇到。
一般在考试中或某些公司的面试笔试中才会出现。


阅读(1160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~