0
点赞
收藏
分享

微信扫一扫

OpenCV(四)—— 车牌号识别

witmy 2024-05-05 阅读 36

结构体介绍(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:跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在

举报

相关推荐

0 条评论