结构体内存对齐

结构体内存对齐

先看两段代码,两段代码仅顺序不同,其结果输出就出现了不同。

struct S
{
	char c1;//1 8 1
	int i;//4 8 4
	char c2;//1 8 1
};

struct S2
{
	char c1;
	char c2;
	int i;
};

int main()
{
	struct S s = { 0 };
	struct S2 s2 = { 0 };
	printf("%d\n", sizeof(s));//12
	printf("%d\n", sizeof(s2));//8
	return 0;
}

接下来对其中的S进行单独分析:

struct S
{
	char c1;//1
	int i;//4
	char c2;//1
};

int main()
{
	struct S s = { 0 };
	printf("%p\n", &s);//002FFED8
	printf("%p\n", &(s.c1));//002FFED8
	printf("%p\n", &(s.i));//002FFEDC
	printf("%p\n", &(s.c2));//002FFEE0
	return 0;
}

结构体内存对齐的规则:
1.结构体的第一个成员永远都对齐到结构体的起始位置处。

2.从第二个成员开始,每个成员都对齐到某个对齐数的整数倍处。

对齐数:成员自身大小和默认对齐数的较小值
默认对齐数:VS-8 Linux-gcc-4

3.结构体的总大小是所有成员中最大对齐数的整数倍。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值