栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

零基础快乐学习C/C++——14

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

零基础快乐学习C/C++——14

结构体内存对齐


来解释为什么会有这种结果:

(1)
第二条可以知道,此时的对齐数是vs默认的8和int型4个字节取最小值,所以对齐数是4, 所以如果你放a,a放到4的整数倍的地址处

c2的对齐数为1和8取最小,故对齐数是1,放到1的整数倍地址处即可


目前来看只占了9个字节,但是第三条可以知道,结构体总大小为最大对齐数的整数倍,目前对齐数为1 4 1 最大对齐数为4,而9不是4的倍数,所以整个结构体大小为4的整数倍,12

(2)
同理,c1对齐数为1,c2对齐数为1,a的对齐数为4,当前所占8个字节,符合最大对其数的整数倍,所以打印输出为8


结果为16

对于结构体嵌套问题,可以参考第四条,由于s3所占16个字节,s3的最大对齐数为8,所以c1从1开始存,而s3从最大对其数的整数倍8开始存,存16个字节,d是从24字节开始放,放8个字节,总共是32个字节,同时结构体的最大对齐数为8,所以符合,最后输出32

为什么要存在内存对齐

所以在设计结构体的时候,就要既要满足对齐,又要节省空间,如何做到:

让占用空间小的成员尽量集中在一起

结构体传参
struct S
{
	int a;
	char c;
	double d;
};

void Init(struct S* ps)
{
	ps->a = 100;
	ps->c = 'w';
	ps->d = '3.14';
}

void Print(struct S tmp)
{
	printf("%d %c %lfn",tmp.a,tmp.c,tmp.d);
}

int main()
{
	struct S s;
	Init(&s);//需要改变s,所以用了&
	Print1(s);//不需要改变s
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847026.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号