目录
相关文章
Android NDK开发:java调用dll动态链接库方法
Android NDK开发:JNIEnv的原理
Android NDK开发:C修改Java的属性
Android NDK开发:C调用Java层方法
Android NDK开发:C创建Java层的对象
Android NDK开发:C操作Java层的数组
Android NDK开发:Native层的变量管理及静态缓存
Android NDK开发:Native层的异常处理
结构体的偏移量及所占大小的计算
我在学习结构体的时候发现,结构体的所占空间的大小与内部变量的排列顺序好像有着某种关系,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char sex;
char color;
int age;
double score;
}Student;
void main() {
Student* stu = NULL;
//打印出结构体的大小与每个变量地址的偏移量
printf("size = %d,offsetsex = %d,offsetcolor = %d,offsetage = %d,offsetscore = %d",sizeof(Student),&(stu->sex), &(stu->color), &(stu->age), &(stu->score));
system("pause");
}
我将这个结构体的大小以及每个变量地址的偏移量打印出来,结果如下:
而如果我将变量的顺序调整一下:
typedef struct{
char sex;
double score;
char color;
int age;
}Student;
则结构体的大小与每个变量地址的偏移量也发生了改变:
后来经过反复的调试我找到了决定结构体大小与变量地址偏移量的规律了,其实变量的偏移量是它后面变量所占空间大小的整数倍,而整个结构体的大小也是所有基础变量大小的整数倍,如果不够则需补上,用代码讲解如下所示:
typedef struct{
char sex;//大小为1,由于下一个变量score所占的空间为8,所以sex所占的空间被提升为8,score地址的偏移量变成了8
double score;//由于下面的color变量的大小为1,所以score的空间大小不变还是8
char color;//大小为1,由于下一个变量age所占的空间为4,所以color所占的空间被提升为4,age地址的偏移量再加上前面的sex与score的变成了20
int age;
}Student;
//整个结构体的大小因此也变成了24,24刚好是8、4和1的整数倍所以,最终大小为24
因此如果想优化结构体的大小但是又嫌计算结构体大小麻烦的话,这里有一个很简单的方法,那就是将所占空间大的变量排前面将所占空间小的变量排最后即可。