美文网首页
杂记1-字节对齐

杂记1-字节对齐

作者: 玻璃缸里的自游 | 来源:发表于2018-12-18 23:58 被阅读0次

1、现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

2、需要字节对齐的根本原因在于CPU访问数据的效率问题。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。假设整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。

3、什么时候考虑字节对齐问题?

在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.

4、字节对齐的作用

字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。

5、如何对齐

对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:

  数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。 

  联合 :按其包含的长度最大的数据类型对齐。 

  结构体: 结构体中每个数据类型都要对齐

6、vc中按整型字节对齐的一个宏:

#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

将计算n应该按整型对齐后的大小。

相关文章

  • 杂记1-字节对齐

    1、现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况...

  • 字节对齐与大端小端与内存区域划分

    字节对齐 C语言字节对齐C语言字节对齐/7213465 大端小端 字节序(大小端)详解从高低地址和高低位开始理解(...

  • iOS 技术

    结构体的字节对齐和OC对象的字节对齐? instance(实例对象)、class(类对象)、meta-class(...

  • 字节对齐

    为什么字节对齐: 体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,...

  • 字节对齐

  • 字节对齐

    什么叫做字节对齐? 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐...

  • 字节对齐

    字节对齐的细节和编译器实现相关,一般满足三个准则: 1.结构体变量的首地址能够被其最宽的基本类型成员的大小所整除 ...

  • 字节对齐

    总原则:结构体变量占据的内存单元的个数应当大于等于其内部所有数据成员占据内存单元数的和。 出于效率的考虑,C预言引...

  • 字节对齐

    概述 字节对齐也称为字节填充,它是C++编译器的一种技术手段,主要目的是为了在空间和复杂度上达到平衡。简单而言,是...

  • #字节对齐

    [TOC] 什么是字节对齐(可以跳过) 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类...

网友评论

      本文标题:杂记1-字节对齐

      本文链接:https://www.haomeiwen.com/subject/qemrkqtx.html