1.什么是内存对齐

假设我们同时声明两个变量:

char a;

short b;

用&(取地址符号)观察变量a,

b的地址的话,我们会发现(以16位CPU为例):

如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004。

那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了? 答案就是它确实没被使用。 因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的。如果变量b的地址是0x0001的话,那么CPU就需要先从0x0000中读取一个short,取它的高8位放入b的低8位,然后再从0x0002中读取下一个short,取它的低8位放入b的高8位中,这样的话,为了获得b的值,CPU需要进行了两次读操作。

但是如果b的地址为0x0002,

那么CPU只需一次读操作就可以获得b的值了。所以编译器为了优化代码,往往会根据变量的大小,将其指定到合适的位置,即称为内存对齐(对变量b做内存对齐,a、b之间的内存被浪费,a并未多占内存)。

2.结构体内存对齐规则(请记住三条内存规则(在没有#pragam pack宏的情况下)

结构体所占用的内存与其成员在结构体中的声明顺序有关,其成员的内存对齐规则如下:

(1)每个成员分别按自己的对齐字节数PPB(指定的对齐字节数,32位机默认为4)两个字节数最小的那个对齐,这样可以最小化长度。如在32bit的机器上,int的大小为4,因此int存储的位置都是4的整数倍的位置开始存储。

(2)复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,结构体数组的时候,可以最小化长度。

(3)结构体对齐后的长度必须是成员中最大的对齐参数(PPB)的整数倍,这样在处理数组时可以保证每一项都边界对齐。

(4)结构体作为数据成员的对齐规则:在一个struct中包含另一个struct,内部struct应该以它的最大数据成员大小的整数倍开始存储。如 struct A 中包含 struct B, struct B 中包含数据成员 char, int, double,则 struct B 应该以sizeof(double)=8的整数倍为起始地址。

3.实例演示:

struct A

{

char a;   //内存位置:  [0]

double b;   // 内存位置: [8]...[15]

int c;    // 内存位置: [16]...[19]  ----  规则1

};        // 内存大小:sizeof(A) = (1+7) + 8 + (4+4) = 24, 补齐[20]...[23]  ----  规则3

struct B

{

int a,    // 内存位置: [0]...[3]

A b,       // 内存位置: [8]...[31]  ----  规则2

char c,   // 内存位置: [32]

};         // 内存大小:sizeof(B) = (4+4) + 24 + (1+7) = 40, 补齐[33]...[39]

*注释:(1+7)表示该数据成员大小为1,补齐7位;(4+4)同理。

错题集之腾讯2016研发工程师笔试题(三)相关推荐

  1. 下面关于HTTP协议的说法正确的是:----腾讯2016研发工程师笔试题(一)

    下面关于HTTP协议的说法正确的是: 正确答案: A C HTTP是基于TCP协议之上的应用层协议 HTTP是一个普通用在浏览器和web服务器之间进行数据交换的流式二进制协议 HTTP协议的ETAG响 ...

  2. 携程2016研发工程师笔试题

    携程2016研发工程师笔试题 2015/12/7 14:56(网上收集整理的,参考答案在后面,若有错误请大神指出) 1. 内存空间被分成不同区域,其中用函数 void*malloc(unsigned ...

  3. 猎豹移动2016研发工程师笔试题

    猎豹移动2016研发工程师笔试题 2015/12/6 13:03(网上收集整理的,参考答案在后面,若有错误请大神指出) 1.下列选项中,属于"10.174.20.176/28"该网 ...

  4. 网易2016研发工程师笔试题

    网易2016研发工程师笔试题 2015/12/9 11:25(网上收集整理的,参考答案在后面,若有错误请大神指出) 1. 执行指令find / -name "test.c",按ct ...

  5. 【恒生公司2016研发工程师笔试卷选择题分析】

    static局部变量相关知识 静态变量在内存的静态存储区,静态数据一直占有着该存储区单元直到程序结束: 静态局部变量只声明一次,一旦申请内存成功,不再接受重复申请: 静态局部变量的作用域与一般局部变量 ...

  6. 名企笔试:京东 2016 算法工程师笔试题(登楼梯)

    名企笔试:京东 2016 算法工程师笔试题(登楼梯) 2017-02-04 算法爱好者 有一段楼梯台阶有 15 级台阶,以小明的脚力一步最多只能跨 3 级,请问小明登上这段楼梯,有多少种不同的走法? ...

  7. linux研发工程师笔试题,2015-8-29阿里校园招聘研发工程师笔试题

    2015-8-29阿里校园招聘研发工程师笔试题 1. 某团队有2/5的人会写Java程序,有3/4的人会写C++程序,这个团队里同时会写Java和C++的至少有()人 A. 3  B. 4  C. 5 ...

  8. 算法题:分苹果(2016京东招聘笔试题)

    笔试题:分苹果(2016京东招聘笔试题) 题目: 果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重 ...

  9. 数据分析真题日刷 | 京东2019校招数据分析工程师笔试题

    今日真题 网易2018校园招聘数据分析工程师笔试卷(来源:牛客网) 题型 客观题:单选51道,不定项选择12道 完成时间 120分钟 牛客网评估难度系数 3颗星 ❤️ 「更多数据分析真题」 <数 ...

最新文章

  1. mysql主键始终从小到大_Mysql从入门到入神之(四)B+树索引
  2. Loadrunner的Tuxedo脚本分析,基本流程和基本函数介绍
  3. 山东财经大学python试卷_山东财经大学微观经济学试卷1及答案
  4. css设置元素的宽高为整数,为什么有的浏览器解析出来的宽高是小数?
  5. JSP常用Form表单控件
  6. 办公网络对工业交换机的功能要求
  7. 【剑指offer】面试题58 - II:左旋转字符串(Java)
  8. hadoop yarn 获取日志_Hadoop YARN配置参数剖析(2)—权限与日志聚集相关参数
  9. 剑指offer--面试题13
  10. 内核全新优化UI界面影视双端源码
  11. Spring高级之注解@PropertySource详解(超详细)
  12. 2021电子设计竞赛题目_艾孜尔江
  13. c语言作业制作仓库管理系统,c语言课设仓库管理系统.doc
  14. 共轭 、 共轭转置、共轭矩阵、酉矩阵、正定矩阵、半正定矩阵
  15. 机场云商sign解析
  16. Eureka服务注册中心搭建
  17. Markdown书写软件Typora的使用--图片上传(PicGo与Github/Gitee)及排版
  18. Python快速入门(1)常用容器和内置函数介绍
  19. 投行数字化转型方案,达观智能文档处理赋能数字投行
  20. Hadoop的java程序报错Exception in thread main java.io.FileNotFoundException: File does not exis

热门文章

  1. 2019顺丰科技笔试
  2. Tableau的符号地图、自定义形状、仪表板应用
  3. 获取shp文件四至范围的方法总结
  4. 海康录像机RTSP回放流的格式
  5. 音箱CE认证办理标准流程介绍
  6. DDD(六)【领域事件与事件总线】
  7. 恶搞赤壁!-诸葛亮泡妞!
  8. 苹果项目关闭服务器,iphone系统服务哪些可以关闭
  9. 用列表编写员工信息登记表以及用js编写验证
  10. 解决暴力摩托等在win7不能玩的问题,Windows7游戏花屏通用补丁 1.2