首页 体育世界正文

李婉淑,C语言中的结构体的size,并不等于它所有成员size之和,为什么?,yuan

结构体在C言语程序开发中,是不可或缺的语法。不过,信任不少C言语初学者遇到过这样的问题:为什么结构体的 size 有时不等于它的一切成员的 size 之和呢?

C言语结构李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuan体巨细等于它的一切成员巨细之和吗?

C言语结构体巨细等于它的一切成员巨细之和吗?

举例来说,假设有结构体,它的C言语代码如下,请看:

struct x{
short s;
int i;
char c;
};

咱们持续死刑犯2充血编写C言语代码,顺次输出成员 s,i,c 占用内存空间的巨细,相关代码很简单,请看:

st李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuanruct x t;
printf("%lu %lu %lu\n", sizeof(t.s), sizeof(t.i), sizeof(c));

实践成果与咱们的预期并不共同

编译并履行这段C言语代码,得到如下输出:

# gcc t.c 
# ./a.out
2 4 1

那么按理说,结构体 x 占用的内存空间应该等于 2+4+1=7 字节,可是好像实践成果与咱们的预期并不共同:

printf("%lu\n", sizeof(t));

上面这行C言语代码输出的成果是 12!这是怎么回事呢?

解析

程序输出的成果与咱们的李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuan预期不共同,原因在秦之声戏迷大叫板于“对齐机制”。假如将结构体 africex 看作是一个容器,鉴于成员 s,i,c 的长度良莠不齐,C言语编译器不得不“填充”一些额定的空间,以满意“对齐机制”。

数据结构是否对齐不只影响C言语程序的功能,有时乃至还会带来意想不到的过错,例如拜访未对齐的数据,或许会导致硬件方面的问题 (SIGBUS,总线过错),导致功能下架,以及损坏一些操作的原子性等并发安全保证。

所以,C神灵变言语编译器在处理结构体时,假如没有特别的指定,一般都会填充一些字节,以保证不违背对川河盖牧场旅游区齐机制。以上面的结胪岗吧构体 x 为例,初学者或许会以为它的成员在内存中的布局如下:

初学者萨菲罗斯vs杰内西斯或许会以为它的成员在内存中的布局

可是,假如编译器依照下面布局,处理器拜访之将愈加便利:

假如编译器依照下面布局,处理器拜访之将愈加便利

不过,这样摆放结构体 x 的成员,会空出一些空间,关于处理器来说,当心的越过李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuan这些空间仍是有些费事,所以大50岁妇女大都C言语编译器都会像下面这样填充空穴:

大大都C言语编译器都会这样填充空穴

这样一来,整个结构体 x 占用内存的空间,其实便是成员 i 占用空间的 3 倍了,也即 12 字节。

事实上,咱们能够经过摆放结构体 x 成员的次序,来优化其占用内存的巨细,例如:

struct y{
int i; /* 4 byte8k90ws */
char c; /* 1 byte */
/* 1 padding byte */
short s; /* 2 bytes */
};
struct z{
int i; 简伯丞/* 4 bytes */
short s; /* 2 bytes */
char c; /* 1 byte */
/* 1 padding byte */
};
const int sizeX =玥玥児 sizeof(struct x); /* = 148小时天气预报2 */
const 污相片int sizeY = size金浜路15号of(stru李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuanct y); /* = 8 */
const int sizeZ = si李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuanzeof(struct z); /* = 8 */

经过摆放结构体 x 成员的次序,来优化其占用内存的巨细

小结

本节首要谈论了C言语中结构体巨细并不一定等于它一切成员巨细之蓝导航和的原因,应该留意,结构对齐在C言语规范中是 implementation defined,不同的C言语编译器或许挑选不同的数据对齐方法,然后导致不公园打野战同和不兼容的数据布局。因而,在运用不同编译器开发C言语程序时,了解编译步氏神族器是怎么对齐数据是红冬蛇菰很重要的。

一些编译器能够指定结构对齐的方法李婉淑,C言语中的结构体的size,并不等于它一切成员size之和,为什么?,yuan,例如 #pragma 句子。

点个赞再走吧

欢迎在谈论区一同谈论,质疑。文章都是手打原创,每天最粗浅的老挝天气预报15天介绍C言语、linux等嵌入式开发,喜欢我的文章就重视一波吧,能够看到最新更新和之前的文章哦(最近发现有些帐号转移我的文章而且标上原创标签,有些可耻,请注明出处!!)。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。