有关数据对齐的初步理解

c++中一直不理解为什么一个结构就是变一下成员变量的顺序,sizeof的值就会随之变化,查了一下原来是因为内存对齐,于是便做了一下最基础的了解。

内存对齐,,是为了方便处理器读取内存中的数据。处理器在读取内存数据的时候,并不是按照字节进行读取,而是按照多个字节为单位的块进行读取,所以,处理器在处理内存对齐的数据只需要读取一遍就可以获取数据,但是如果不是对齐,就可能需要两次读取进行结合而获取数据。一般情况下,内存对齐是属于编译器的管理范围,但是像c++这种强大而灵活的语言,他就可以自定义对齐模式,所以,便整理了一些最基础的笔记。

     独立变量或者成员变量,他们在内存中的存储位置都是自身size大小的整陪数,比如,int的大小是4,他的起始位置应该是(0,4,8),而char的大小是1,所以,他可以任意存储在任何位置。

在这里,我总结结构体的内存对齐:

遵循三个原则:1-第一个数据成员放置0处,以后的是自身大小的倍数为起始位置

                    2-结构体作为成员,不用说,那他的起始位置当然也是结构中最大在成员的倍数了,

                    3-每个结构的sizeof必定是最大成员大小的倍数,不足的补齐

 

struct A

{

 char a ;     //为1,存储于结构为0的地方,占用【0】,

char b;       //size是1,存储于【1】

int c;          //size是4,起始位置应该是4的陪数,所以编译器会补齐两位,然后再【3-7】的位置存储

}

所以,sizeof(A)的值是8=1+1+(补齐两位)+4;    (总共占了【0-7】8个字节,刚好8%4=0)          

strcut B

{

 char a ;   //size是1,存储在起始位置是0的地方。【0】

int b;      //size是4,所以,先补齐三位,在4的最近倍数3这个位置作为起始位置,存储空间为【3-7】

char a ;   //size是1,可以再8的位置存储【8】

}

所以,sizeof(B)的值是12=1+(补齐三位)+4+1+(补齐三位);(总共占了【0-8】9个字节,据最近余4为0的值应该是12)

 

现在说c++中,#pragma pack(n)可以自定义数据对齐的值:是以n与变量大小比较,取较小的一个作为对齐标准。如:

#prargma pack(2)

strct A

{

  char a; //size是1, 1<2,所以是以1对齐,1%1=0 ,所以【0】

int b;   //size是4, 4>2 ,所以是以2对齐,2%2=0,所以【2,5】

char c;  //size是1,1<2,所以是以1对齐,6%1=0,所以【6】

}

所以sizeof(A)的值是8;(共占了【0-6】7个字节,余2为0的最近值是8)

 

 

  

 

原文链接: https://www.cnblogs.com/yy0910/archive/2012/10/16/2726938.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    有关数据对齐的初步理解

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/65970

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午12:06
下一篇 2023年2月9日 下午12:06

相关推荐