因为今天和同事谈到了ARM平台下数据总线宽度及对齐方式对程序效率的影响问题
在定义结构数据类型时,为了提高系统效率,要注意字长对齐原则。
1.
先看下面的例子:
#include <iostream.h>
#pragma pack(4)
struct A
{
char a;
int b;
};
#pragma pack()
#pragma pack(1)
struct B
{
char a;
int b;
};
#pragma pack()
int main()
{
A a;
cout<<sizeof(a); //8
B b;
cout<<sizeof(b); //5
}
默认的vc我记得是4字节对齐,而ADS下是一字节对齐。
先谈PC下的对齐:
大家可以看到在ms的vc下按4字节对齐和1字节对齐的结果是截然不同的分别为8和5为什么会有这样的结果呢?这就是x86上字节对齐的作用。为了加快程序执行的速度,一些体系结构以对齐的方式设襁POST http://blog.ycul.com/post.php HTTP/1.0 D?长作为对齐边界。对于一些结构体变量,整个结构要对齐在内部成员变量最大的对齐边界,如A,整个结构以4为对齐边界,所以sizeof(a)为8,而不是5。
如果是原始我们概念下的的A中的成员将会一个挨一个存储 应该只有char+int只有5个字节这个差异就是由于对齐导致的显然我们可以看到 A的对齐要比B浪费3个字节的存储空间那为什么还要采取对齐呢?
那是因为体系结构的对齐和不对齐,是在时间和空间上的一个权衡。
字节对齐节省了时间。应该是设计者考虑用空间换取时间。
为什么说对齐会提高效率呢节省时间?我想大家要理解的重点之重点就在这里了
在我们常用的PC下总线宽度是32位
1.如果是总线宽度对齐的话
那么所有读写操作都是获取一个<=32位数据可以一次保证在数据总线传输完毕。没有任何的额外消耗。
|1|2|3|4|5|6|7|8|
从1开始这里是a的起始位置,5起始为b的位置 访问的时候
如果访问a一次在总线传输8位其他24位无效的
访问b时则一次在总线上传输32完成
读写均是一次完整
插说一下:读操作先要将读地址放到地址总线上然后下个时钟周期再从外部
存储器接口上读回数据通过数据总线返回需要两个周期
而写操作一次将地址及数据写入相应总线就完成了。
读操作要比写操作慢一半
2.我们看访问数据时如果不对齐地址的情况
|1|2|3|4|5|6|7|8|
此时a的地址没变还在1而因为是不对齐则b的位置就在2处
这时访问就带来效率上问题 访问a时没问题还是读会一个字节
但是2处地址因为不是总线宽度对齐一般的CPU在此地址操作将产生error
如sparc,MIPS。它们在硬件的设计上就强制性的要求对齐。在不对齐的地址上肯定发生错误。但是x86是支持非对齐访问的。
它通过多次访问来拼接得到的结果,具体做法就是从1地址处先读回后三字节234 暂存起来。然后再由5地址处读回一个字节5 与234进行拼接组成一个完整的int也就是b返回。
大家看看如此的操作带来的消耗多了不止三倍。很明显在字长对齐时效率要高许多。但然这种效率仅仅是访问多字节带来的。如果还是进行的byte操作那效率差不了多少。
嵌入式开发普遍比较重视性能,所以对齐的问题,有3种不同的处理方法:
1)有一种使用空间换时间做法是显式的插入reserved成员:
struct A{
char a;
char reserved1[3]; //使用空间换时间
int b;
}a; ==>感觉此种编码方式比较专业,有显式提醒代码阅读者与维护者的功能...
2)随便怎么写,一切交给编译器自动对齐。
3)还有一种将逻辑相关的数据放在一起定义。
代码中关于对齐的隐患,很多是隐式的。比如在强制类型转换的时候。下面举个例子:
unsigned int i = 0x12345678;
unsigned char *p=NULL;
unsigned short *p1=NULL;
p=&i;
*p=0x00;
p1=(unsigned short *)(p+1);
*p1=0x0000;
最后两句代码,从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。
在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error。
相关推荐
联想工程师专用小工具 4K扇区对齐查看工具V3.71.1联想工程师专用小工具 4K扇区对齐查看工具V3.71.1联想工程师专用小工具 4K扇区对齐查看工具V3.71.1联想工程师专用小工具 4K扇区对齐查看工具V3.71.1联想工程师专用小...
4. **使用系统内置的磁盘碎片整理工具**:某些系统如Windows 8及更高版本,内置的磁盘碎片整理工具也包含了4K对齐功能。 综上所述,4K扇区对齐对于现代硬盘,尤其是固态硬盘的性能至关重要。"4K扇区对齐查看工具V...
"技巧141嵌入图表排列与对齐共2页.pdf.zip"这个文件很可能包含了一份简短但实用的教程,教导用户如何在文档中有效地管理和布局图表,以提升报告的专业性和可读性。以下是对这一主题的详细阐述: 首先,我们来讨论...
"Word中对齐网格和对象选项的启用和关闭" 在Word中,启用或关闭对齐网格和对象选项是非常重要的,这可以帮助用户更好地控制形状和对象的排列和对齐。在本文档中,我们将详细介绍如何在Word中启用或关闭对齐网格和...
这个插件是专为提高CAD用户在处理文字对齐问题时的效率而设计的。在CAD软件中,文字对齐是一项重要的操作,它涉及到图纸的清晰度和专业性。 描述中提到,“输入ap点击文件加载”是指在CAD软件中,用户需要先输入...
三维人脸对齐与重建_孙圣鹏.caj
3D密集面部对齐_基于Pytorch实现的快速+准确+稳定的3D面部对齐算法_优质项目实战.zip
200使用候选对象对齐的对象检测_new.pdf
84使用候选对象对齐的对象检测_new.pdf
15使用候选对象对齐的对象检测_new.pdf
无线通信系统中干扰对齐算法的研究毕业论文.doc
产品数据通用库存统计坐标轴左对齐的条形图Excel模板.xlsx
《联想工程师专用小工具——4K扇区对齐查看工具V3.71.1》 在计算机领域,硬盘性能的优化是提升系统运行效率的关键因素之一,其中4K扇区对齐是不可或缺的一环。联想工程师专用小工具003-4K扇区对齐查看工具V3.71.1....
C语言结构体的字节对齐及指定对齐方式 在C语言中,结构体的字节对齐是非常重要的,它直接影响着程序的性能和可移植性。本文将详细介绍结构体的字节对齐、指定对齐方式和相关概念。 一、字节对齐的作用和原因 字节...
间 对齐得 到 目 标对齐源坐标系 , 并将数据投影到对齐后 的子空 间 中 , 得到数据 的低 维表示 ; 最后 , 在源域数据上建立 S VM 分类器 , 将源域 中 的 类别信 息迁移 到 目 标 域 中 以 预测 目 标域数据 ...
内存对齐是计算机科学中关于数据存储的一种策略,它的目的是优化数据访问速度并节省内存空间。在C语言中,`sizeof`操作符用于获取数据类型或变量所占用的内存大小。在描述的文档中,主要讨论了内存对齐在结构体`...
Transmate语料对齐工具是一个Transmate翻译软件的辅助工具,可以帮助用户快速制作Transmate语料库,可以将翻译的稿件快速转换为Transmate的记忆格式,支持单语稿件和双语搞件。 Transmate语料对齐工具主要特性 1、...
对于【标签】中的“技巧142”,可能是对某一特定排列或对齐方法的详细说明,但没有具体的文件内容,我们无法提供更详细的解释。至于“赚钱项目”,由于它并不直接关联到图表排列与对齐,我们可以推测可能是指使用...
[500,600]被3but not被7整除的整数右对齐占5个宽度输出.py
ARM架构的字对齐问题是一个重要的优化策略,它涉及到处理器的内存访问效率和代码的可移植性。在现代计算机系统中,尽管内存是以字节为单位进行分配的,但为了提高处理速度和兼容性,数据通常需要在特定的边界上对齐...