(转)VC 字节对齐

来源:互联网 发布:2016年石材进出口数据 编辑:程序博客网 时间:2024/05/20 07:54

 

 

见到N多的笔试题目考到相关内容,作题目时老是非常迷糊,索性一怒,狂看,终于有所得。

在这做个总结:

 

一、VC默认方式的字节对齐:

1.数据成员对齐规则:
在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量:sizeof(类型)或其倍数

2.整体对齐规则:
结构的总大小也有个约束条件:最大sizeof(类型)的整数倍


如:struct MyStruct 
{
char dda;
double dda1; 
int type
};//sizeof=1+7+8+4+4=24


二、自己设定字节对齐方式
VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。

1.数据成员对齐规则:
n字节对齐就是说变量存放的起始地址的偏移量:min(sizeof(类型),对齐方式)或其倍数.
2.整体对齐规则:
结构的总大小也有个约束条件:min(最大的sizeof(类型),对齐方式)的倍数.

#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
char m1; //默认偏移量
double m4;//非默认偏移量
int m3; //默认偏移量
}; //sizeof=1+3+8+4=16应为4的倍数
#pragma pack(pop)//恢复对齐状态

#pragma pack(push) //保存对齐状态
#pragma pack(16)//设定为4字节对齐
struct test
{
char m1;//默认偏移量
double m4;//默认偏移量
int m3;//默认偏移量
}; //sizeof=1+7+8+4+4=24应为8的倍数。
#pragma pack(pop)//恢复对齐状态

三、sizeof简单应用

1. 参数为数据类型或者为一般变量。
例如sizeof(int),sizeof(long)等等。
这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。

2. 参数为数组或指针。下面举例说明.

int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小

int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针的大小,在32位系统中,当然是占4个字节。

3. 参数为结构或类。
Sizeof应用在类和结构的处理情况是相同的。
但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。
第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。

下面举例说明,

Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s为一个指针。
Class test1{ };//sizeof(test1)=1;

4. 参数为其他。下面举例说明。
int func(char s[5]);
   {
     cout<<sizeof(s);
//这里将输出4,本来s为一个数组,但由于做为函数的参数在传递的时候系统处理为一个指针,所以sizeof(s)实际上为求指针的大小。
     return 1;
}
sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于//求sizeof(int).


四、sizeof(含位域的结构体)

使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

测试:
struct test
{
char a:1;
char :2;
long b:3;
char c:2;
};
test t1;
int len=sizeof(t1);   //len=1+3+4+1+3=12

struct test
{
char a:1;
char :2;
char b:3;
long c:2;
};
test t1;
int len=sizeof(t1);   //len=1+3+4=8

struct test
{
char a:1;
char :2;
char b:3;
char c:2;
};      
test t1;
int len=sizeof(t1);   //len=1

 

转自:清平乐--百度空间

http://hi.baidu.com/gaomanyi/blog/item/9cf279638b96cb660d33fad0.html

 

 

 

 

原创粉丝点击