C/C++字节对齐规则-创新互联

C/C++字节对齐规则 什么是字节对齐

现代计算机中,内存空间按照字节划分,理论可以从任何骑术地址访问任意类型的变量。但是实际访问中特定类型的变量经常在特定的内存地址访问,这就需要各种类型数据按照一定规则在空间上排列,而不是一个接一个地存放,这就是对齐

创新互联建站,专注为中小企业提供官网建设、营销型网站制作、响应式网站开发、展示型成都网站制作、网站建设等服务,帮助中小企业通过网站体现价值、有效益。帮助企业快速建站、解决网站建设与网站营销推广问题。对齐的原因和作用

但最常见的情况是,如果不按照平台要求对数据存放进行对齐,会带来存取效率上的损失。比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率下降很多。

因此,通过合理的内存对齐可以提高访问效率。为使CPU能够对数据进行快速访问,数据的起始地址应具有“对齐”特性。比如4字节数据的起始地址应位于4字节边界上,即起始地址能够被4整除。

此外,合理利用字节对齐还可以有效地节省存储空间。但要注意,在32位机中使用1字节或2字节对齐,反而会降低变量访问速度。因此需要考虑处理器类型。还应考虑编译器的类型。在VC/C++和GNU GCC中都是默认是4字节对齐。

结构体对齐

在C语言中,结构体是种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构体、联合等)的数据单元。编译器为结构体的每个成员按照其自然边界(alignment)分配空间。各成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。字节对齐的问题主要就是针对结构体。

简单示例
struct A {int	  a;
    char  b;
    short c;
};
struct B {char  b;
    int   a;
    short c;
};

结果:sizeof(struct A) = 8,sizeof(struct B) = 12

结构体A中包含一个4字节的int数据,一个1字节char数据和一个2字节short数据;B也一样。按理说A和B大小应该都是7字节。之所以出现上述结果,就是因为编译器要对数据成员在空间上进行对齐。

对齐规则

首先了解一些基本概念:

  1. 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double为8字节
  2. 结构体或类的自身对齐值:其中成员自身对齐值大的那个值
  3. 指定对齐值:#pragma pack(value)时的指定对齐值value
  4. 数据成员、结构体类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}

其中,有效对齐值N是最终用来决定数据存放地址方式的值。有效对齐N表示“对齐在N上”,即该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序存放。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐存放,结构体本身也要根据自身的有效对齐值圆整(即结构体成员变量占用总长度为结构体有效对齐值的整数倍)。

字节对齐与具体编译器相关,但一般都遵循以下三条规则:

  1. 结构、联合或类的数据成员,第一个相对于首地址放在偏移为0的地方;
  2. 结构、联合或类的各成员相对于首地址的偏移量,都是#pragma pack指定的数值和该成员大小中较小那个的整数倍。如有需要编译器会在成员之间加上填充字节;
  3. 结构、联合或类的总大小为最宽基本类型成员大小与#pragma pack指定的数值中较小那个的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
C++无数据成员类

无数据成员的类(包括空类),编译器分配1个字节的内存空间。这样的意义在于,创建的实例所指向的就是有意义的内存空间。

如果基类无数据成员,C++标准允许派生类的第一个成员与基类共享地址,基类并没有占据任何实际的空间。但若派生类的第一个成员类型仍然是基类,编译器仍会为基类分配1字节的空间,这是因为C++标准要求类型相同的对象必须地址不同。

指针的大小

有关寻址范围计算解释,对于32位寻址的CPU,其地址值为32位的二进制数,所以可以表示的大地址为2的32次方(即4G,大内存空间为4GB,这里G表示数量、GB表示容量)。同时我们不难看出,一个指针的值就是一个32位的二进制数,32位对应 4字节(Byte)。所以,指针的大小实际上是由CPU的寻址位数决定,而不是字长。

参考:

C/C++字节对齐规则_春日绿野的博客-博客_c++字节对齐规则

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:C/C++字节对齐规则-创新互联
新闻来源:http://pwwzsj.com/article/dghhsg.html