结构体介绍(2)
前言
根据之前讲了结构体的《声明》、《创建》、《初始化》、《结构体内存对齐》。 接下来我们就来深入探讨结构体
问题:那么有没有考虑结构体嵌套结构体的内存对齐呢?
一、结构体的内存对齐之深入理解
示例:
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int mian()
{
struct S4 s4 = { 0 };
printf("%zd\n", sizeof(s4));
return 0;
}
#pragma pack(1)//把默认对齐数定义为1
struct S
{
char c;
int i;
char a;
};
int main()
{
printf("%zd\n", sizeof(struct S));
return 0;
}
二、结构体传参
2.1:该怎么传参呢?
代码如下(示例):
struct S
{
int arr[1000];
int n;
double b;
};
void print1(struct S tmp)
{
int i = 0;
for (i = 0;i < 5;i++)
{
printf("%d", tmp.arr[i]);
}
printf("%d\n", tmp.n);
printf("%lf\n", tmp.b);
}
int main()
{
struct S s = { {1,2,3,4,5},100,3.14 };
print1(s);//这里s里面的数组arr[1000](空间大),但是传参过去时会有空间的浪费
return 0;
}
三、结构体实现位段
3.1什么是位段
位段的内存分配
3.2
位段的跨平台问题
在16位int是2个字节!!!
如果我们把16位看成32位那么这样就会产生不同结果!!!
所以位段是不跨平台的。
总结
1:结构体内存对齐----浪费空间来促进时间;
2:位段-------节省内存;
3:跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在