C语言-结构体对齐

对齐意义

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

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

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

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

对齐规则

     1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。
        对齐时按照自身的对齐值对齐,且变量的首地址能整除对齐值。
     2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
        满足条件:结构体的总体值%成员变量最大对齐值=0
     3) 指定对齐值:#pragma pack (value)时的指定对齐值value。
     4) 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。

举例说明(1字节对齐情况下)

	typedef struct
	{
		char a;
		char b;
		char c;
		char d;
		char e;
	}A;

sizeof(A) = 5,满足5%1=0.

	typedef struct
	{
		short a;
		short b;
		short c;
	}B;

sizeof(B) = 6,满足6%2=0.

	typedef struct
	{
		char a;
		short b;
		short c;
		short d;
		char e;
	}C;

sizeof(C) = 10,满足(9+1)%2=0.

	typedef struct
	{
		char a;
		short b;
		int c;
		short d;
	}D;

sizeof(D) = 12,满足(10+2)%4=0.

	typedef struct
	{
		char a;
		short b;
		int c;
		double d;
	}E;

sizeof(E) = 16,满足16%8=0.

	typedef struct
	{
		char a;
		short b;
		int c;
		char d;
		double e;
	}F;

sizeof(F) = 24,满足24%8=0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值