为什么要进行字节对齐?
《Windows核心编程》里这样说:当CPU访问正确对齐的数据时,它的运行效率最高,当数据大小的数据模数的内存地址是0时,数据是对齐的。例如:WORD值应该是总是从被2除尽的地址开始,而DWORD值应该总是从被4除尽的地址开始,数据对齐不是内存结构的一部分,而是CPU结构的一部分。当CPU试图读取的数值没有正确的对齐时,CPU可以执行两种操作之一:产生一个异常条件;执行多次对齐的内存访问,以便读取完整的未对齐数据,若多次执行内存访问,应用程序的运行速度就会慢。
字节对齐实验理解
定义:在系统默认的对齐方式下:每个成员相对于这个结构体变量地址的偏移量正好是该成员类型所占字节的整数倍,且最终占用字节数为成员类型中最大占用字节数的整数倍。
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
int num;
int sss;
int yyy;
char name[50];
public:
void print_name()
{
cout << "name = " << name << endl;
};
};
int main() {
Student stud = { 0 };
int stud_size = sizeof(stud);
cout << "stud_size = " << stud_size << endl;
system("pause");
return 0;
}
首先定义一个结构体,计算他的内存,按照一般正常的思维来说这里
int num;//占用4个字节
int sss;
int yyy;
char name[50];//占用1*50个字节
总的字节数应该是62个字节,然而程序的结果却是64个字节,原因就是字节对齐规则,总的字节数要为成员类型所占最大字节数的整数倍。62不是整数倍,向上最小的就是64。
把上述结构体修改一下进行验证,如果只有int就是4字节,只有char就是1字节,char[50]就是50字节。
如果一个char[50],一个int就是56字节,多出来的两个字节就是为了满足字节对齐规则。