算法思路:
1. offset设置为0. offset就是分配空间的偏移量
2. 依次对结构里面的每个成员p进行下面的计算。如果计算完毕,跳到第7步。
2. 计算temp=min(p的对齐参数,系统对齐参数)。p如果是内置数据类型,对齐参数有编译器给出。比如char的对齐参数是1等等。系统对齐参数由#pragram pack(n)设置,默认为8。如果p本身是数据结构,p里面最大的成员对齐参数就是p的对齐参数。
3. 如果offset/temp=0,意味着可以整除,跳到第5步
4. 如果offset/temp!=0,意味着不能整除,调整offset(增加一个小于temp的大小),使得其可以整除temp
5. 给当前成员分配空间,也就是offset加上当前成员的实际大小,比如int的话就是4,double就是8,结构的话就是结构自己的sizeof()大小。
6. 跳到第2步
7. 最后需要保证:offset需要整除当前结构的对齐参数
#include <stdio.h>
#define PACK_DEFAULT 8 //系统默认对齐参数,通过#pragram pack(n)来设置,默认是8
#define CHAR_T 1 //char的自身对齐参数,和编译器有关系
#define INT_T 4 //int的自身对齐参数,和编译器有关系
#define SHORT_T 2 //short的自身对齐参数,和编译器有关系
#define FLOAT_T 4 //float的自身对齐参数,和编译器有关系
#define DOUBLE_T 8 //double的自身对齐参数,和编译器有关系
#define LONG_T 4 //long的自身对齐参数,和编译器有关系
int getsize(int *a, int size){
int offset=0;
int pack_max=0,temp;
int i;
for(i=0;i<size;i++){
int p=a[i];
temp=min(p,PACK_DEFAULT);
//判断是否;不能整除的话,需要补齐
if(offset%p){
//不能整除
offset = (offset/p+1)*p;
}
//给当前变量分配空间
offset+=p;
//寻找整个结构的最大对齐参数
pack_max=max(temp,pack_max);
}
//整个结构的空间大小需要整除最大对齐参数
if(offset%pack_max){
offset = (offset/pack_max+1)*pack_max;
}
return offset;
}
int main(int argc, char *argv[])
{
int S1[]={INT_T,CHAR_T,SHORT_T};
int S2[]={CHAR_T,INT_T,SHORT_T};
printf("sizeof(s1)=%d, sizeof(s2)=%d \n",
getsize(S1,sizeof(S1)/sizeof(int)),
getsize(S2,sizeof(S2)/sizeof(int)));
return 0;
}