作者:寒小阳
时间:2013年9月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/11596001。
声明:版权所有,转载请注明出处,谢谢。
前言:
之前分析迅雷近几年笔试题的时候,提到了一类问题考察的是内存对齐的知识。之前做的总结中少了这部分知识,而回忆起来,去年的大大小小那么多场笔试,确实有不少公司都还考察这个,这里正好就单独写一篇,总结总结这个问题吧。有不当之处,欢迎大家留言指正,谢谢!
一.何为内存对齐,内存对齐的作用
我们现在使用的算机中内存空间都是按照字节(Byte)划分的,理论上说,似乎对任何类型的变量的访问可以从任意地址开始,但实际情况则是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型的数据按照一定的规则在内存空间上排列,而不是顺序的一个接一个地排放,这就是对齐。
二.编译器内存字节对齐的原则
1. 数据类型的自身对齐值
数据类型的自身对齐值:其在内存中所占的字节数,如在32位系统中,char为1字节,short为2字节,int、float、double、long为4字节。
2.结构体或类的自身对齐值
结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
3.默认对齐值
结构体或类的默认对齐值为其成员中自身对齐值最大的那个值。
4.指定对齐值
使用#pragmapack(value)时指定的值value。
5.结构体和类的有效对齐值
结构体和类的有效对齐值为:没有指定对齐值时为默认对齐值和自身对齐值的最小值;当指定了对齐值后为指定对齐值和自身对齐值的最小值。
三.如何修改编译器的默认对齐值
在编码时,我们可以这样动态修改编译器的对齐值:
1)修改默认对齐值,指定新的内存对齐值:#pragmapack(value)
2)取消指定的内存对齐值,恢复默认对齐值:#pragmapack()
四.如何进行内存地址对齐
对于一个结构体,不但需要对其每个成员变量进行内存地址对齐,还要对结构体本身进行对齐。具体规则是:在假设结构体起始地址为0x0000的情况下,要求各成员变量的起始地址必须是其相应有效对齐值的整数倍,并要求结构体的大小也为该结构体有效对齐值的整数倍。
例4.1:
struct A
{
int a;
char b;
short c;
};
则该结构体所占的内存字节数sizeof(structA)=8;
具体分析如下:
故该结构体及其成员变量的有效对齐值为编译器默认对齐值和其自身对齐值的最小值:
inta的自身对齐值为4
charb的自身对齐值为1
shortc的自身对齐值为2
structA的自身对齐值为max(4,1,2)=4
编译器默认对齐值为各成员变量自身对齐值中的最大值,即为4。
故 inta的有效对齐值为min(4,4)=4
charb的有效对齐值为min(1,4)=1
shortc的有效对齐值为min(2,4)=2;
structA的有效对齐值为min(4,4)=4
假设结构体A从地址空间0x0000开始排放。由上面的计算可知,第一个成员变量inta的有效对齐值为4,所以其存放的地址为0x0000~0x0003,且其起始地址0x0000符合0x0000%4=0;第二个成员变量charb的有效对齐值为1,所以其存放地址为0x00004,且其起始地址0x0004符合0x0004%1=0;第三个成员变量shortc的有效对齐值为2,所以其存放地址应该为0x0006~0x0007,而其起始地址0x0006也符合0x0006%2=0;
最后还要对整个结构体进行内存地址对齐:即要保证整个结构体的大小应该为其有效对齐值的整数倍,而该结构的有效对齐值为4,现在三个成员变量已经占据了0x0000~0x0007共8个字节的内存空间,而8%4=0也符合对齐要求,故整个结构体的大小应该为8.
例4.2
#pargma pack(8)
struct A
{
short a; //有效对齐值为min(2,8) = 2
long b; //有效对齐值为min(4,8) = 4;
};
struct B
{
char c; //有效对齐值为min(1,8) = 1
struct B s; //有效对齐值为min(4,8) = 4
short e; //有效对齐值为min(2,8) = 2
};
#pargma pack()
分别求出sizeof(structA)和sizeof(structB)的值。
类似例4.1可分析:
sizeof(structA)=8,sizeof(structB)=16
分享到:
相关推荐
EE笔试面试题目集合分类--IC设计基础.pdf
EE笔试面试题目集合分类--IC设计 希望可以帮到找工作的朋友,
C_C++语言程序设计笔试面试题2011最新1-6全集最新
C语言深度解剖(解开程序员面试笔试的秘密)--------以含金量勇敢挑战国内外同类书籍
中国移动通信类面试笔试知识点复习资料知识题库考试资料合集: 知识点之--(通信类)LTE基础知识.pdf 移动笔试知识点之--(通信类)中国移动考试知识点.pdf 移动笔试知识点之--(通信类)中通网通信试题大全(网络...
嵌入式岗位笔试面试真题讲解_嵌入式-常用知识&面试题库_大厂面试真题.rar
很不多的java笔试题 java面试笔试题---基础
2-5-1-银行招聘笔试计算机知识点--计算机基础知识点总结.pdf
阿里、腾讯、美团、网易等大厂产品运营岗笔试、面试主观题真题-常考题型总结及解题思路.docx阿里、腾讯、美团、网易等大厂产品运营岗笔试、面试主观题真题-常考题型总结及解题思路.docx阿里、腾讯、美团、网易等大厂...
各公司C C++招聘笔试面试题大全_嵌入式-常用知识&面试题库_大厂面试真题.rar
各个公司面试笔试题 深圳-华为 武汉-高蓝德国际人 中兴笔试题 清华同方
HIT-Alibaba 笔试面试知识整理 HIT-Alibaba 笔试面试知识整理
06大数据面试复习---1套真实企业项目架构流图 07大数据面试复习----简历编写 08大数据面试复习----面试技巧 09大数据面试复习----人事HR面试常问的问题总结 10大数据面试复习---相关学习资料 11大数据面试题规律总结...
计算机笔试面试之---计算机面试笔试经典集合,可以看看
【内部资料】----IBM公司JAVA程序员笔试面试题汇总及答案 本人修正了很多错误
中国移动计算机类面试笔试知识点复习资料知识题库考试资料合集: 移动笔试知识点之--ICT业务.pdf 移动笔试知识点之--计算机类-操作系统复习资料.pdf 移动笔试知识点之--计算机类-数据库系统概论复习资料.pdf 移动笔试...
大数据面试复习---Java基础---集合类、多线程、JVM 大数据面试复习----常问问题分析 大数据面试复习----画重点----思维导图 大数据面试复习----简历编写 大数据面试复习----练习的面试题+笔试题 大数据面试复习----...
面试知识点总结--java笔试算法题及答案.pdf
数据结构1800题-面试笔试必过---最全最佳答案,有答案才学到东西