历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2020年09月09日 | 数据总线宽度:对齐的含义和怎样去对齐以及带来的效率差

2020-09-09 来源:elecfans

最近和同事谈到了ARM平台下数据总线宽度及对齐方式对程序效率的影响问题,在定义结构数据类型时,为了提高系统效率,要注意字长对齐原则。正好有点感触和大家一起谈谈。


这里主要给大家解释下所谓的对齐到底是什么?怎么对齐?为什么会对齐或者说对齐带来什么样的效率差异?

对齐的含义和怎样去对齐以及带来的效率差异

1.先看下面的例子:

#include

#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<

B b;

cout<

}


默认的vc++我记得是4字节对齐ADS下是一字节对齐,因为是c/c++社区大家对PC比较熟悉 我就谈PC下的对齐。


PC下设计放的太长时间的有错误就别客气直接说,大家可以看到在ms的vc下按4字节对齐和1字节对齐的结果是截然不同的分别为8和5为什么会有这样的结果呢?这就是x86上字节对齐的作用。


为了加快程序执行的速度,一些体系结构以对齐的方式设计,通常以字长作为对齐边界。对于一些结构体变量,整个结构要对齐在内部成员变量最大的对齐边界,如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操作那效率差不了多少

目前的开发普遍比较重视性能,所以对齐的问题,有2种不同的处理方法:

1) 有一种使用空间换时间做法是显式的插入reserved成员:

struct A{

char a;

char reserved1[3]; //使用空间换时间

int b;

}a;

2) 随便怎么写,一切交给编译器自动对齐。

还有一种将逻辑相关的数据放在一起定义

代码中关于对齐的隐患,很多是隐式的。比如在强制类型转换的时候。下面举个例子:

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

推荐阅读

史海拾趣

DIOTECH公司的发展小趣事

随着全球环保意识的不断提高,DIOTECH公司也开始关注绿色环保和可持续发展问题。公司投入大量研发资源,成功开发出了一系列绿色电子产品,这些产品在生产过程中采用了环保材料和生产工艺,并且具有低功耗、长寿命等特点。这些产品的推出不仅满足了市场对环保产品的需求,也提升了公司的社会责任感和品牌形象。

BNS Solutions公司的发展小趣事

在快速发展的过程中,BNS Solutions公司始终注重品质管理和品牌建设。公司建立了一套完善的质量管理体系,从原材料采购到产品生产、销售等各个环节都严格把控质量。同时,公司还注重品牌形象的塑造和维护,通过广告宣传、公关活动等方式不断提升品牌知名度和美誉度。这些举措使得BNS Solutions公司的产品在市场上具有更高的竞争力,赢得了消费者的信赖和喜爱。

CAO Group Inc公司的发展小趣事

随着公司的发展壮大,CAO Group开始面临来自各方面的竞争压力,其中包括知识产权的争议。近期,公司针对其在美国注册的三项专利——Lumist美白贴、SPRAY BOTTLE HEAD喷雾瓶头和透明氟塑料,发起了维权行动。公司积极应对,通过法律手段保护自身的知识产权,展示了其维护合法权益的决心和实力。

Herotek Inc公司的发展小趣事

在电子元件的制造过程中,粘接技术是关键环节之一。Henkel凭借其深厚的技术积累和创新能力,在电子元件粘接领域取得了显著成就。其研发的粘合剂产品具有优异的粘接强度、耐温性能和耐化学腐蚀性能,能够满足各种复杂工况下的使用需求。例如,在汽车电子领域,Henkel的粘合剂产品被广泛应用于传感器、控制器等关键部件的粘接固定中,确保了汽车电子系统的稳定性和可靠性。

启攀微电子(Chiphomer)公司的发展小趣事

启攀微电子(Chiphomer)公司成立于2003年,当时正值中国集成电路产业快速发展的初期。创始人张杨带领着一支由英美归国的留学精英和国内资深管理与技术人员组成的团队,立志要在这一领域闯出一片天地。然而,初创时期的资金短缺、技术壁垒和市场认可度低等问题,让公司面临着巨大的挑战。然而,他们凭借着对技术的执着追求和对市场的敏锐洞察,成功推出了首款SDH通信芯片,为公司的后续发展奠定了坚实的基础。

Ememory Technology Inc公司的发展小趣事

为了满足市场对高性能、低功耗芯片的需求,eMemory在2016年宣布向150nm高电压制程工艺扩展其可编程Neobit技术。这一技术的成功开发,使得eMemory能够在LCD驱动IC、逻辑IC和功率控制IC等高速增长的市场中占据一席之地。Neobit技术的可擦编程只读存储器特性,为芯片设计提供了更大的灵活性和可定制性。

问答坊 | AI 解惑

用FPGA做过FFT的朋友,可否给一些程序作为参考?

最近做这方面的内容,有些吃不消 希望大家可以给一些例子作为参考。或者提供一些方法。 也希望正为此头疼的朋友,大家多多讨论。 FFT,英文名Fast Fourier Transforation,中文译音,快速傅里叶变换,其功能是实现频谱的快速计算,即对时序的 ...…

查看全部问答>

在WINCE系统下,对话框最多能同时层叠多少个?

最近做一个项目,感觉同时存在了5个以上对话框,机子就会挂掉,怀疑是对话框开太多! 死机之前,串口打印出“stack fault……”等错误信息。请问是因为对话框层叠太多的原因吗?…

查看全部问答>

请教关于pxa270的LCD控制器

PXA270的LCD控制器包含7个DMA通道 以前没用过DMA,不知道这个东西怎么用 看了一下SPEC和相关的代码 发现需要这样一个描述符的结构: typedef struct LCDFrameDescriptorS {         UINT32 FDADR;       ...…

查看全部问答>

各位大侠帮帮小妹!

本人最近想在无字库的lcd通过调用字库显示汉字,但不知道如何取得区位码。请各位大侠指教一二!不胜感激!…

查看全部问答>

哪里有picmcu单片机的指令集下载?我的邮箱:16362712@sohu.com

哪里有picmcu单片机的指令集下载?我的邮箱:16362712@sohu.com…

查看全部问答>

弱弱的问一个:uCOS-ii的一个基础问题

uCOS-ii中好多下面这个代码: #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU stat ...…

查看全部问答>

2602新型测试仪器如何缩短测试时间?

Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1]   可降低测试成本的重要参数 在本文的前面,介绍过四个降低测试成本的关键因素:缩短测试时间、缩短开发时间、减少测试设备所占的面积和机架的空间大小以及降 ...…

查看全部问答>

需要自动调谐算法克服的“常见误差”

哪些是2510-AT自动调谐算法中常见的误差来源呢?它们有哪些局限性是需要克服的?   常见问题 由于力输出线缆颠倒,可能出现温度超程(ORR)。在2510-AT型自动调谐温度控制源表[1]前部面板上,可以很容易地观察到这一点。如果在温度超程状态 ...…

查看全部问答>

IP核问题

从网上下载了个开源串口IP核,包含四个VHDL文件,如何在QUARTUS中生成一个串口核呢。难道是一个VHDL文件生成一个SYMBOL,然后四个SYMBOL再合并成一个SYMBOL是这样操作吗…

查看全部问答>