首页 > 技术文章 > 关于C/C++的字节对齐

lishuai0214 2015-02-28 22:01 原文

为什么要字节对齐呢?这要从计算机的结构说起,我们知道,在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 d1 char c1 int i1

推荐阅读