数组下标从0开始的优势:少计算一次减法,数=首地址+偏移元素大小;否则数=首地址+(偏移-1)元素大小;
结构体对齐规律:
首先选定一个盒子,然后一次将字段往盒子里放,当盒子放不下后,又用下一个盒子放,直至所有字段存放完毕;
其中,盒子大小=min(max(sizeof(成员变量)),对齐长度);
其中的对齐长度在编译器的代码生成中设定,在C\c++–>代码生成–>结构成员对齐中,也可以使用代码:#pragma pack (value)
来告诉编译器,使用我们指定的对齐值来取代缺省的。
如#pragma pack (1) /*指定按2字节对齐*/ #pragma pack () /*取消指定对齐,恢复缺省对齐*/;
字段放入盒子的位置如下:离盒子头部偏移字节数=n*sizeof(成员变量)(n=0,1,2….);
结构体会产生填充,因此要安排变量的位置,尽量做到无填充对齐,
#include <iostream>
using namespace std;
struct pdf
{
// char c;//以这种方式,将报文char[]转换成报文结构体时会因为填充而错误
// int len;
int len;
char c;
};
int main()
{
char buf[64];
buf[1]=12;
*(int *)&buf[0]=12;
// buf[5]=0;
// buf[6]=0;
// buf[7]=0;
pdf *pd;
pd=(pdf *)buf;
cout<<pd->c<<endl;
cout<<pd->len<<endl;
cout<<(int)buf[1]<<endl;
//cout<<sizeof(P);
}
又例如:
struct hdr{char c;short n;char c2;};
应该调整为struct hdr{char c;char c2;short n;};