关于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 d1 | char c1 | int i1 |