数据对齐

简介:

许多计算机系统对数据类型的合法地址做了一些限制,要求某种数据类型对象的地址必须是某个值K(2,4,8)的倍数,这种堆积限制简化形成了处理器和存储器系统之间接口的硬件设计,总之就是为了方便高效的读取数据,于是就有了数据对齐。

复制代码
struct S1

{

   char k;

   double i;

   char c; 

};
复制代码

 

Sizeof(S1)的值为24,而不是10,其原因就是数据对齐,如果是连续的存每个字段的值,那么double类型的i就可能分配在两个8字节的存储器块中,那么可能就要执行两次存储器访问,而现在的内存分配至这样的,k,i,c都占用8个字节,这样访问1次存储器就能得到double类型的i的值。k后面会有7个字节被浪费掉,也就是说i的偏移量是8,同样的c后面有7个字节被浪费掉,尽管它后面没有任何字段。这样显然太浪费内存了。如果我们将i和c的位置交换一下得到如下struct S2:

复制代码
struct S2

{

   char k;

   char c;  

   double i;

};
复制代码

 

现在Sizeof(S2)的值为16,而不是10也不是24。为了方便取出struct中最长的字段,即方便一次性读出,这个最长的字段前面和后面的字段所占的长度都必须是它的倍数,在这里就是double的长度8的倍数。而k所占的长度加c所占的长度为2,小于8,所以k和c的内存是连续的,c后面接着的是6个空白字节然后就是i所占的8个字节。我想你会有这样的疑问:为什么不直接把S1编译成S2?我只能说我也不知道,但有一个类似的情况就是:在类的初始化列表中,先定义的字段先初始化。那么在这里先定义的先分配内存, 还有就是struct根本没有产生多与的东西,来区分每个字段,要是编译器把他们的内存结果重组了,它又怎么知道自己读的是哪个字段呢。以上几句只是阿汉的个人理解,没有任何证明。

 

有了上面的解释说明,在看一些简单的struct所需的内存就容易了。

复制代码
struct S3

{

   char k;

   int c;

   double i;

};
复制代码

 

Sizeof(S3):16,k与c连续,c后面3个字节空白,紧接着i占8个字节,共16个字节。

复制代码
struct S4

{

   S3 a;

   int i[5];

};
复制代码

 

那么sizeof(S4)的值为多少呢?40,a占16个字节,i占24个字节。a占16个字节我们是知道的,为什么int i[5]占24个字节,而不是20个字节呢,还是因为数据对齐,因为S3中的double i占8个字节,那么i占用的字节长度就一定是8的倍数,所以int i[5]占24个字节,而不是20个字节,如果S4中i的定义是int i[4],则i占16个字节,大家都没话说,没有疑问。

同样的S4中的所有元素都是连续(会出现因为数据的长度不同而出现间隙空白),S4中的元素也会遵守数据对齐原则,其实我们可以把S4看成如下的样子:

复制代码
struct S4

{

   char k;

   int c;

   double i;

int i[5];

};
复制代码

 

这样就好理解多了。

如果S3和S4的样子如下

复制代码
struct S3

{

   char k;

   int c;

   int i;

};

 

struct S4

{

   S3 a[2];

   double i[5];

};
复制代码

 

sizeof(S4)等于多少呢?

 

作者:陈太汉

博客:http://www.cnblogs.com/hlxs/



本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2012/10/03/2711128.html

目录
相关文章
|
7月前
|
机器学习/深度学习 人工智能 安全
大模型的安全对齐技术
大模型的安全对齐技术
444 1
大模型的安全对齐技术
|
1月前
|
UED
使用约束布局实现居中对齐效果
【10月更文挑战第24天】我们可以看到使用约束布局实现居中对齐并不是一件难事。只要掌握了基本的方法和技巧,结合具体的场景进行灵活运用,就能轻松地实现各种居中对齐效果。在实际开发中,要不断实践和总结经验,以便更好地发挥约束布局的优势,为用户带来更优质的界面体验。
34 1
|
3月前
单元格内容的对齐方式
单元格内容的对齐方式
35 1
|
4月前
段落标记<p>的对齐属性
【8月更文挑战第30天】段落标记<p>的对齐属性
36 0
|
6月前
|
前端开发 UED
深入理解CSS中的文本对齐方式:水平对齐与垂直对齐
深入理解CSS中的文本对齐方式:水平对齐与垂直对齐
160 5
|
5月前
|
前端开发
css 图标和文字对齐 —— 垂直居中对齐,任意位置对齐
css 图标和文字对齐 —— 垂直居中对齐,任意位置对齐
120 2
|
5月前
|
前端开发 容器
CSS【详解】对齐 (含文本垂直对齐,文本水平对齐、单行文本垂直居中、多行文本垂直居中、6 种方案块级元素水平垂直居中 、7 种方案图片水平垂直居中、文本自适应对齐、图标和文本对齐,图片和文本对齐等)
CSS【详解】对齐 (含文本垂直对齐,文本水平对齐、单行文本垂直居中、多行文本垂直居中、6 种方案块级元素水平垂直居中 、7 种方案图片水平垂直居中、文本自适应对齐、图标和文本对齐,图片和文本对齐等)
134 0
|
7月前
|
前端开发
文本对齐
文本对齐。
32 1
|
数据采集 人工智能 自然语言处理
我们要对齐什么——从对齐任务类型与对齐目标明确数据收集准则
在Modelscope活动中,主办方欲通过模型盲测收集并整理一批人类反馈数据。本次我在数据的收集过程之外,根据问答与模型的输出,结合论文From Instructions to Intrinsic Human Values -- A Survey of Alignment Goals for Big Models,具体探究了本次实验过程中的对齐目标。
380 0
03:对齐输出
03:对齐输出
124 0