字节对齐有三原则:

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
 int id;             //[0]....[3]
 double weight;      //[8].....[15]      原则1
 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2];     //[0],[1]
 int  id;         //[4]...[7]          原则1

double score;     //[8]....[15]    
 short grade;    //[16],[17]        
 BB b;             //[24]......[47]          原则2
}AA;

int main()
{
  AA a;
  cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
  return 0;
}

结果是

48 24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲#pragma pack().

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为

32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

ps:Vc,Vs等编译器默认是#pragma pack(8),所以测试我们的规则会正常;注意gcc默认是#pragma pack(4),并且gcc只支持1,2,4对齐。套用三原则里计算的对齐值对其进行测试时是不能大于#pragma pack指定的n值。

快速弄懂内存字节对齐相关推荐

  1. 更改结构体的内存字节对齐方式--经典

    结构体字节对齐 http://blog.163.com/ecy_fu/blog/static/4445126200910603739941/ http://hi.baidu.com/skyland_l ...

  2. C语言内存字节对齐小结

    在C语言面试和考试中经常会遇到内存字节对齐的问题.今天就来对字节对齐的知识进行小结一下. 首先说说为什么要对齐.为了提高效率,计算机从内存中取数据是按照一个固定长度的.以32位机为例,它每次取32个位 ...

  3. 快速弄懂陌生领域是一项“赚钱”的能力

    大家好,我是Z哥. 有时候,我们被动的需要去了解一个新行业或者领域.比如,工作需要.投资需要等等. 在这个时候,你能不能快速弄懂一个行业的80%,成为一个内行就很关键了.毕竟时机可是很重要的. 比如, ...

  4. Hello C(八)——内存字节对齐

    一.内存字节对齐简介 1.内存字节对齐 计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编 ...

  5. 详解结构体、类等内存字节对齐

    先说个题外话:早些年我学C程序设计时,写过一段解释硬盘MBR分区表的代码,对着磁盘编辑器怎么看,怎么对,可一执行,结果就错了.当时调试也不太会,又根本没听过结构体对齐这一说,所以,问题解决不了,好几天 ...

  6. 【C】C语言内存字节对齐

    原博地址:https://blog.csdn.net/andy572633/article/details/7213465 首先说说为什么要对齐.为了提高效率,计算机从内存中取数据是按照一个固定长度的 ...

  7. 数据库原理:了解范式(1NF、2NF、3NF、BCNF),做例题快速弄懂

    如果你基本定义都理解了,建议直接跳到例题部分. 本篇讲的是范式及例题,如果函数依赖还不知道,请移步至另外一篇讲函数依赖的博客: 数据库原理:通过例题弄懂函数依赖,并附带题目_Allow-er的博客-C ...

  8. 彻底弄懂dalvik字节码【三】

    [一].[二]中从代码的角度分析了dalvik字节码解释执行的过程,这篇文章以一个例子来实际分析一下. 我们以这篇文章中提到的crackme为例,下载链接参见那篇文章.我们只分析dalvik字节码,因 ...

  9. 彻底弄懂dalvik字节码【一】

    之前曾经简单跟踪过代码,知道dalvik的字节码是可以支持解释执行的,所谓的解释执行,其实就是c/c++编写的用于解释并执行dalvik字节码的程序,说白了就是dalvik字节码到cpu字节码的转换. ...

最新文章

  1. 吴文俊人工智能科学技术奖:陆汝钤院士、百度王海峰等获奖
  2. 如何编码和解码base64字符串?
  3. 网工路由基础(8)路由重分布
  4. 关闭后天 树莓派_陪你一起玩树莓派-系统安装
  5. .net 反射调用私有变量
  6. 全新设计的 Xcode 12
  7. 【报告分享】2019全球住宅报告.pdf(附下载链接)
  8. 使用单例时的三种单例写法
  9. 第十五章:进程间通信
  10. oracle14501,【图片】【dbdao.com Oracle OCP认证专题】Oracle 11g OCP 考题讲解【oracle吧】_百度贴吧...
  11. Qt界面语言设置(官方汉化)
  12. segger_rtt使用帮助
  13. Vulnhub DC-7
  14. JavaSE基础20笔记IO流
  15. 采集CSI数据的实验
  16. 设计模式 - 学习笔记 - 适配器模式AdapterPattern
  17. 教你从零开始搭建阿里云ESC服务器(建站)新手必看!
  18. GitLab——提交合并请求
  19. [note] 微电子学概论(二) PN结 MOS和MOSFET
  20. 北大ACM暑期培训感想

热门文章

  1. 流量难、获客难、增长难?增长黑客思维“解救”B端业务
  2. 【视频技术解读】编解码的理论和实践
  3. git作死之天坑记录
  4. Qtum量子链受邀出席日本早稻田研究所区块链教育讲座
  5. 用asp.net还原与恢复sqlserver数据库(转)
  6. gulp 常用插件汇总
  7. mysql优化之连接优化(open-files-limit与table_open_cache)
  8. 采用web技术开发PC应用
  9. Windows NT体系结构
  10. 编写完html文件怎么输出,怎么编写一个html文件?在线等!!