序言:来上专业课了,是网课,没有互动功能,干听,很讨厌,有一些细节问题,没讲清楚,真服了,不吐槽了,直接上问题吧。
问题描述
在学到结构体时有一个对齐与补齐原则:网课给的概念是
接下来我们进行验证:
struct S1{
char i; //一个字节
short z;//两个字节
int y; //四个字节
double x;//8个字节
}s2;
根据原则:
char i :在内存中 i 1个字节 则不是4的整数倍,后面应该补 3个空,但是别着急后面跟的时short z;(2个字节)
本质上应该是 char i 空 z(2个字节)//此时总共4个字节补了一个
后边是 int y:本身4个字节,是4的整数倍 则应该整好放到内存块
接下来是double类型:本身8个字节,按照给的概念超过4字节的按8字节来算,出现问题了,应该是也是4字节,这样一算长度是12:但是运行结果是16.
所以正确的因该是把最后一句概念去掉,应该是以最大的长度为一个内存分配块,而不是超过4字节的按4字节算。
正确理解:在本组定义中,最大的是double:8字节,内存是以8为内存块的,所以最终长度,肯定是8的倍数,比如:
struct S1{
char i; //内存 1字节 0*** **** (注:*代表空,0代表有数据)
short z; //内存 2字节 0*00 ****
int y; //内存 4字节 0*00 0000
double x; //内存 8字节 0*00 0000
// 0000 0000
int a; //内存 4字节 0*00 0000
// 0000 0000
// 0000 **** 共24字节
}s2;
只要是所有元素中,最大字节小于4字节,则内存(linux,clion,编译器)默认4字节为一个内存块,如果元素中最大类型超过4,则最终结果一定是该数长度的整倍数。
如有问题请留言!感谢。