内存字节对齐

来源:互联网 发布:变号王软件下载 编辑:程序博客网 时间:2024/06/06 19:29

之前对内存字节序知道一些,但是一直没有系统的学习过,导致有时候还是说不清楚的,今天在网上查到一些自己,学习了下,并验证了,特意给大家分享下,希望对大家能有帮助;

总的来说就三条原则(在没有#pragma pack宏的时候):

1、数据成员对齐规则,在结构体(struct)中,第一个数据成员从0开始,以后每个数据成员的存储位置要从该数据成员大小的整数倍开始(如:int在32位机器上是4个字节,则要从4的倍数开始存)

2、结构体做为数据成员,如果在一个结构体中包含某些结构体数据成员,则结构体成员存储的起始地址要从其内部最大元素大小的整数倍开始存储(如:struct BB中有struct AA,AA中有char、int、double数据成员,则BB从8的整数倍开始存储)

3、最后一条,结构体的总大小,也就是sizeof算出来的结果,必须是其内部最大数据成员的整数倍,不足的要补齐。



struct AA 
{
char name[2]; //[0] [1]
int  age; //[4] [5] [6] [7] 原则1


double score; //[8] -- [15]
int  height; //[16] -- [19] 总大小结构体中最大成员的整数倍,补齐8个字节 原则3
};


struct BB 
{
int age; //[0] -- [3]
double score; //[8] -- [15] 原则1

short grade; //[16] -- [17]

struct AA a; //[24] -- [47] 原则2
};


//字节对齐 end
int main(int argc, char* argv[])
{
//字节对齐
std::cout << "AA size is " << sizeof(AA) << std::endl;
std::cout << "BB size is " << sizeof(BB) << std::endl;
return 0;
}

结果:



还有#pragma pack(n)这个宏,这个宏的作用就是来设置所有字节是按n的整数倍对齐的。

如果在前面加上#pragma pack(1),则是按照1的整数倍对齐,相当于没有对齐

其结果就是所有成员加起来的大小:




原创粉丝点击