C语言结构体-内存对齐

1、内存对齐

不管是结构体,还是普通的变量都存在内存对齐

2、规则

只能放在自己类型整数倍的内存地址上。

可以简单理解成:

内存地址 / 占用字节 = 结果可以整除

例如:

int存放的位置:内存地址一定能被4整除

long long存放的位置:内存地址一定能被8整除

double存放的位置:内存一定能被8整除

3、结构体的内存对齐

结构体内存的总大小,是最大数据类型的整数倍(用来确定最后一个数据补位的情况)

在内存对齐的时候,会补上空白字节,并不会改变原本数据类型的字节大小。

例如:在char类型后面补了4个或者多个空白字节,char类型本身在内存中占用的空间还是1个字节。

4、练习

判断结构体的内存大小:

(1)练习1,如图:

如图,是上面结构体在内存中的占用字节情况

第一个数据类型是double,字节数为8,0可以是任何数的倍数,所以double类型从0索引开始占用;

char类型,字节数为1,任何数都可以是1的倍数,所以占用索引8的内存

int类型,字节数为4,由于9-11之间都没有4的倍数,所以会填补空字节,这里用NULL代替。

char类型,占用索引16的内存;此时所有的属性都占用了内存,但是结构体会进行内存对齐,最后的内存大小是最大数据类型的属性的倍数,即double的倍数,在0-16之间由于空间都被占用,所以要继续往下占用字节,到24便停止,17-24全部填补空字节。

(2)练习2,如图:

如图,如果把数据类型小的放到前面,会节约内存空间。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇