c++结构体对齐方式及计算

我先给几个列子以便理解对齐方式:
(1)三个一个byte的char类型一个8byte的int类型

typedef struct {
	char ch;
	char sh;
	char ds;
	DWORD64 dw;
}Test;
//获取地址
	Test t;
	int ss = sizeof(t);
	auto* p1 = &(t.ch);
	auto* p2 = &(t.sh);
	auto* p3 = &(t.ds);
	auto* p4 = &(t.dw);

获取到地址如下:

可以看到三个char一次按顺序排列,8byte单独一行,以最大的int64为行的长度,长度为16byte。

此时占据16个字节总共。
(2)我将其中一个char换到最后

typedef struct {
	char ch;
	char sh;
	DWORD64 dw;
	char ds;
}Test;
//获取地址
	Test t;
	int ss = sizeof(t);
	auto* p1 = &(t.ch);
	auto* p2 = &(t.sh);
	auto* p3 = &(t.ds);
	auto* p4 = &(t.dw);

获取到地址如下:

可以看出排列方式char1、char2单独一行,int64一行,char3一行,以最大的int64为行的长度如下,长度为24byte:

(3)增减一个short类型

typedef struct {
	char ca;
	char cb;
	short sa;
	DWORD64 ia;
	char cc;
}Test;

排列如下,长度为24byte:

(4)增减一个int类型在char2与short之间

typedef struct {
	char ca;
	char cb;
	int ia;
	short sa;
	DWORD64 da;
	char cc;
}Test;

排列方式如下,总共占32字节:

(5)将short放到int前

typedef struct {
	char ca;
	char cb;
        short sa;
	int ia;
	DWORD64 da;
	char cc;
}Test;

排列方式如下,占24字节:


总结:结构体中元素按照定义顺序依次置于内存中,但并不是紧密排列。从结构体首地址开始依次将元素放入内存时,元素会被放置在其自身大小的整数倍偏移量地址上,开始偏移量以0开始。


参考文档:https://zhuanlan.zhihu.com/p/26122273

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楼兰小石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值