c++11~c++20 -06-字节对齐alignof、alignas

前言

C++11中新增加了alignof和alignas两个关键字,其中alignof运算符可以用于获取类型的对齐字节长度,alignas说明符可以用来改变类型的默认对齐字节长度。

接下来先看看下面这段代码:

#include<iostream>
using namespace std;

struct A
{
	char   a1;
	int    a2;
	double a3;
};

struct B
{
	short  b1;
	bool   b2;
	double a3;
};


int main()
{

	cout << "sizeof(A) = " << sizeof(A) << endl;
	cout << "sizeof(B) = " << sizeof(B) << endl;
		
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
奇怪的事情是A的成员变量的大小应该为 1+4+8 = 13,B的成员变量大小应该为:2+1+8 = 11.但是他们本身的数据长度却为16.有经验的程序员因该一眼就能看出其中的原因,实际上一个类型的属性除了其数据长度,还有一个重要的属性–数据对齐的字节长度。下面给出A的内存布局示意图
在这里插入图片描述
那这里肯定有人会有疑问:为什么要内存对齐呢?其实原因很简单,就是硬件需要。一个好的对齐字节长度可以让CPU运行起来更加轻松快速,反过来说,不好的对齐字节长度会让CPU运行速度减慢。通常来说所谓好的对齐长度和CPU访问数据总线的宽度有关系,比如CPU访问32位宽度的数据总线,就会期待数据按照32位对齐,也就是4字节,这样CPU读取4字节的数据只需要访问一次.

使用alignof运算符

添加如下的代码:

struct C
{
	short  b1;
	bool   b2;
};

int main()
{

	cout << alignof(int) << endl;
	cout << alignof(double) << endl;

	cout << alignof(A) << endl;
	cout << alignof(B) << endl;
	cout << alignof(C) << endl;
		
	system("pause");
	return 0;
}

结果:
在这里插入图片描述

C++11之前内存对齐方式
#pragma pack(2)   /*指定按2字节对齐  ~start*/    
struct A
{
	char   a1;
	int    a2;
	double a3;
};

#pragma  pack() //*取消指定对齐,恢复缺省对齐 ~ end */

int main()
{

	cout << alignof(A) << endl;
	cout <<"sizeof(A) = "<< sizeof(A) << endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
不字节对齐的话 就设置#pragma pack(1)

#pragma pack(1)   /*指定按2字节对齐  ~start*/    
struct A
{
	char   a1;
	int    a2;
	double a3;
};

#pragma  pack() //*取消指定对齐,恢复缺省对齐 ~ end */

结果:
在这里插入图片描述

使用alignas

alignas一般在类型定义时,放在名称前,可以接受常量表达式和类型作为参数,可以修饰变量、类的数据成员等,不能修饰位域和用register申明的变量。一般往大对齐。

直接看一段代码(结合上一段代码):

struct alignas(4) A
{
	char   a1;	
};


struct alignas(32) B
{
	short  b1;
	bool   b2;
	double a3;
};


struct alignas(8) C
{
	short  b1;
	bool   b2;
};

int main()
{

	cout <<"alignof(A) = "<< alignof(A) << endl;
	cout <<"sizeof(A) = "<< sizeof(A) << endl;

	cout << "alignof(B) = " << alignof(B) << endl;
	cout << "sizeof(B) = " << sizeof(B) << endl;

	cout << "alignof(C) = " << alignof(C) << endl;
	cout << "sizeof(C) = " << sizeof(C) << endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值