结构体字节对齐(初识)

目录

一.知识点预备

二.字节对齐的原因

三.结构体对齐规则与练习:

四.答案

欢迎大家批评指正!!!



一.知识点预备

各数据类型的大小:

64位:

 

 注意:在32位和64位下,指针的大小不一样,32位指针大小为4byte,而64位的指针大小为8byte。

二.字节对齐的原因

内存大小的基本字节是byte,理论上,可以从任意地址访问变量,但是,cpu并非是逐字节访问内存的,而是以2,4或8的倍数。为了访问方便,这就要求数据类型在空间上以一定的规则排列。

比如:

"struct A

{

char a;

int b;

char c;

}"

以方法一存储时,提取数据不太好提取,转换提取长度大小是需要时间的。

以方法二存储时,将提取长度固定为4,这样提取的快,但浪费的空间多。

字节对齐是以空间换时间的典型。

a

b

b

b

b

c

a

b

b

b

b

c

三.结构体对齐规则与练习:

以上一个结构体为例进行讨论:

1.结构体变量的首地址,一定是这个结构体变量中最大的基础(内置)类型的成员大小的整数倍。

(首地址为0,0是4的整数倍,所以a在第一个)

0

a

2.结构体变量中的每一个成员的地址,一定是该成员的基础数据(内置)类型大小的整数倍。

a相对于开始地址的偏移量为0

b相对于开始地址的偏移量为1,b的数据类型的大小为4,1不是4的整数倍,故a后补三个空格()。

此时c相当于开始得知的偏移量为8,是1的整数倍。

a

a

b

b

b

b

a

b

b

b

b

c

3.结构体变量的总大小一定是这个结构体变量中最大基础类型大小的整数倍。(最后考虑这个)

(经过前两步的分析,此时的总大小为9,不是4的整数倍,故在c之后添加三个空格),故最终占了12个格子。

那么,如果这样写:

题目一:

"struct A

{

int b;

char a;

char c;

}"

题目二:

“struct B

{

char a;

short b;

int c;

}”

题目三:

“struct C

{

char a;

short b;

double c;

}”

题目四:

“struct D

{

char a;

float b;

int *c;

}”

结果见文末,大家可以试试

四.答案

题目1;8

题目2:8

题目3:16

题目4:12

欢迎大家批评指正!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值