关于C/C++的字节对齐

为什么要字节对齐呢?这要从计算机的结构说起,我们知道,在C/C++中定义的变量有单字节(char),双字节(short),四字节(int,float),八字节(long),但是CPU并不一个字节一个字节来读取处理的(8位单片机除外哈),目前常见的CPU都是32位甚至64位,这意味着CPU一次要读取4个字节或者8个字节,并且不能从任意地址开始读取,只能从地址是4或8的倍数地方开始。所以,要是一个int型数据正好被4或8的倍数分成两块呢,那CPU只能分两次来读,效率当然降低了,而如果浪费点内存,把char和int都放到4或8的倍数的地址上,那么CPU就能节省一些读取的时间而提高效率,这就是所谓的字节对齐。废话不说,上代码:

#include <iostream>
using namespace std;

struct MyStruct
{
  double d1;
  char c1;
  int i1;
};

int main()
{
  cout<<sizeof(MyStruct)<<endl;
}

这是一段简单的C++关于结构体的代码,程序的输出结果是多少呢?double是8字节,char是1字节,int是4字节,那么结果应该是8+1+4=13,至少教材是这么说的,呵呵。但是实际运行结果是16,编译器把double放到对齐的8个字节中,而char占4个对齐的字节,int占4个对齐的字节,这就是16个字节。

4字节4字节4字节
double d1char c1int i1

转载于:https://www.cnblogs.com/lishuai0214/p/4306265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值