首页 / C语言 / C语言结构体的内存对齐问题
C语言结构体的内存对齐问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C语言结构体的内存对齐问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1828字,纯文字阅读大概需要3分钟。
内容图文
![C语言结构体的内存对齐问题](/upload/InfoBanner/zyjiaocheng/1295/3480808a458b475db7756298bf1d0248.jpg)
在C语言开发当中会遇到这样的情况:
1 #include <stdio.h> 2 3struct test { 4int a; 5char b; 6}; 7 8int main(int argc, constchar * argv[]) 9{ 10 printf("%lu\n", sizeof(struct test)); 11return0; 12 }
sizeof操作输出的结果是8,可是int和char类型的长度加起来只有5,那么为什么输出了8呢?
这就牵扯到结构体的内存对齐问题,事实上,结构体中的变量在内存当中并不是以一种连续紧凑的方式存储的。
上面这个例子是一种最简单的情况,来看一下它的内存排布:
0x0 | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 | 0x6 | 0x7 | 0x8 | 0x9 | 0xA | 0xB | 0xC | 0xD | 0xE | 0xF | |
0x10 | a | b | 空位 | |||||||||||||
0x20 |
可见,从0x15到0x18都是空位,为什么要这样存储呢?因为计算机字长为4,处理结构体变量时,需要一次读入32位,也就是4个字节,那么假定两个结构体变量a和b,a从0x10开始,b从0x15开始的话,则需要两次寻址,第一次是读出0x14到0x17,取出后三位,第二次是从0x18到0x1B,取出第一位,然后做位运算,由于变量处理很频繁,这样就增加了性能的开销,那么只能采取用空间换时间的策略了。
假设有两个结构体变量,那么内存排布是这样的:
0x0 | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 | 0x6 | 0x7 | 0x8 | 0x9 | 0xA | 0xB | 0xC | 0xD | 0xE | 0xF | |
0x10 | a | b | 空位 | a | b | 空位 | ||||||||||
0x20 |
这便是内存对齐的第一个方面——结构体的末尾如果没有对齐,则会留出空位来,为排在它前后的变量提供寻址上的便利。
事实上,结构体的大小,必然是其中占用空间最大的类型的长度的整数倍。
接下来改变一下我们的结构体:
它的长度同样是8,内存排布如下:
0x0 | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 | 0x6 | 0x7 | 0x8 | 0x9 | 0xA | 0xB | 0xC | 0xD | 0xE | 0xF | |
0x10 | b | 空位 | a | |||||||||||||
0x20 |
同样基于上面提到的原因,如果将a放在0x11的位置,需要两次寻址。那么,结构体内存排列的一个重要原则就是要得到最少的寻址次数,显然,为了方便找到int型的a,需要在b后面空出3个字节的空间来。
下面举一个稍微复杂一点的例子:
它的长度是32,看一下内存排列:
0x0 | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 | 0x6 | 0x7 | 0x8 | 0x9 | 0xA | 0xB | 0xC | 0xD | 0xE | 0xF | |
0x10 | a | 空位 | b | c | d | 空位 | ||||||||||
0x20 | e | f | 空位 |
为了让变量b寻址方便,在a的后面空出了3个字节,而c和d无论如何都要寻址一次,所以顺序排下去就可以了,而e长度为8,按说可以从0x1C开始排,但是这里需要和类型本身的长度8进行对齐,则排在了0x20的位置,于是乎d的后面又空出了6个字节的空间,最后f排在e的后面,之后为了结构体本身和最长类型的长度8对齐,后面又留出了7个字节的空位。
显而易见结构体当中变量的顺序是会影响存储空间的,在设计结构体的时候需要进行优化,比如将上面的结构体改写成下面的形式可以节省空间:
这种排列只占用16字节,内存如下:
0x0 | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 | 0x6 | 0x7 | 0x8 | 0x9 | 0xA | 0xB | 0xC | 0xD | 0xE | 0xF | |
0x10 | a | c | d | f | b | e | ||||||||||
0x20 |
可见,内存对齐是一种空间换时间的手段,当然,为了节约内存,可以通过如下代码令结构体紧凑排列:
原文:http://www.cnblogs.com/Azazqing/p/3661370.html
内容总结
以上是互联网集市为您收集整理的C语言结构体的内存对齐问题全部内容,希望文章能够帮你解决C语言结构体的内存对齐问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。