龙空技术网

C/C++编程语言经典面试题,改变结构体内存对齐方式,提升性能!

薛定谔的小猫猫 1460

前言:

此刻大家对“结构体内存对齐算法”大概比较讲究,你们都想要学习一些“结构体内存对齐算法”的相关资讯。那么小编在网上汇集了一些对于“结构体内存对齐算法””的相关文章,希望看官们能喜欢,小伙伴们快快来学习一下吧!

本文主要来讲C/C++编程语言中的内存对齐,首先来看下面这段代码

struct node1 { char x; int y; char z;};struct node2 { char x; char z; int y;};int main() { printf("%d %d\n", sizeof(node1), sizeof(node2)); return 0;}

输出结果为12和8。但按照C语言中所学的,char占1字节,int占4字节,都应该输出6才对,而为什么输出结果不符合预期呢? 这就需要了解C/C++中的内存对齐原理。

我们都知道内存是一个连续的存储块,通常情况下以4个字节对齐为一个单位,而在C/C++中,都会遵循内存对齐。如下图

对于node1来说,char x申请了最上面的1字节,int y申请时发现上面还剩下3字节,不够用,所以遵循内存对齐原则,直接使用中间的4字节,最后char z使用最下面部分的1字节,这样其实有6字节是浪费掉的。

对于node2来说,char x申请了最上面的1字节,char z申请时候由于还剩下3字节,完全够用,所以它使用了最上面第二个字节,最后int y申请时候发现最上面还剩下2字节,不够使用了,遵循内存对齐原则,直接使用中间的4字节,这样整个node2只占用8字节,浪费掉了2字节。

那么既然是这样,是不是将4个字节对齐改为1个字节对齐为一个单位,就没有浪费了,这样岂不是更好?虽然听起来有道理,但是这样做效率会非常低,因为CPU从内存中取数的时候,一个内存单元只取一次,举个例子,对于int y,如果4个字节对齐为一个单位只需要取一次,而改为1个字节对齐为一个单位则需要取4次,效率自然就低了。

其实这就是拿时间换取空间,或拿空间换取时间。所以考虑时间效率和空间的折中,C语言中默认以4字节对齐为一个内存单位。如果我们想改变默认的字节数,可以通过#pragma pack实现,代码如下

#pragma pack(push);#pragma pack(1);struct node1 { char x; int y; char z;};struct node2 { char x; char z; int y;};#pragma pack(pop);int main() { printf("%d %d\n", sizeof(node1), sizeof(node2)); return 0;}

这样输出的结果都为6了,但效率会很低。

所以在不改变内存单位的默认字节数的情况下,在定义结构体时,我们可以适当调整变量的位置,来达到节约内存的目的。

标签: #结构体内存对齐算法