0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据总线宽度:对齐的含义和怎样去对齐以及带来的效率差异

Q4MP_gh_c472c21 来源:互联网 作者:佚名 2018-01-30 09:34 次阅读

最近和同事谈到了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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8643

    浏览量

    361659
  • PC
    PC
    +关注

    关注

    9

    文章

    1949

    浏览量

    152770
  • 数据总线
    +关注

    关注

    2

    文章

    47

    浏览量

    17342

原文标题:嵌入式er日常!和同事交流ARM平台字节对齐带来的效率差异

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数据总线宽度可以配置为24位吗?

    是否可以将数据总线宽度配置为24位?我检查了8, 16位和32位之间的差异,只改变了最后8位中的第七十九行(CyuU3pIPIBGPGIFIFBuxCONFIG)。我需要24位数据
    发表于 08-21 09:02

    什么是数据总线宽度/地址总线宽度

    什么是数据总线宽度/地址总线宽度数据总线宽度   数据
    发表于 02-04 10:25 6597次阅读

    详解C语言字节对齐

      一、什么是对齐以及为什么要对齐:   1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是
    发表于 08-29 10:11 1140次阅读

    ARM内存边界对齐以及sizeof问题

    默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。
    发表于 06-16 11:10 2805次阅读

    基于ARM程序的字节对齐的分析

    首先说说,什么叫对齐。如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐;半字对齐的特征是bit0=0,其他位为任
    发表于 09-19 16:04 0次下载

    一个跟地址对齐有关的应用异常案例

    也就是说,基于CortexM3内核的芯片,它支持部分指令的非对齐访问,但非对齐访问要慢于对齐访问。即非对齐访问是需要代价的,访问效率会受到影
    的头像 发表于 02-04 15:20 2311次阅读
    一个跟地址<b class='flag-5'>对齐</b>有关的应用异常案例

    总线宽度总线带宽的区别

    很多人把计算机总线宽度总线带宽混为一谈,其实他们是不一样的。
    发表于 09-01 09:52 1.4w次阅读

    SSD固态硬盘对齐的方法

    大家多听过SSD固态对齐,或者也试的对齐,怎么看是否对齐呢?
    发表于 06-25 17:09 3922次阅读
    SSD固态硬盘<b class='flag-5'>对齐</b>的方法

    基于深度学习的点云对齐算法3DMatch

    点云对齐是点云数据处理的重要步骤之一,粗对齐则是其中的难点。近年来,基于深度学习的点云对齐取得了较大进展,特别是3 Match方法,能够在噪声、低分辨率
    发表于 04-23 15:48 5次下载
    基于深度学习的点云<b class='flag-5'>对齐</b>算法3DMatch

    STM32 终极字节对齐解析

    一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个比较好理解。uint8_t定义变量地址要1字节对齐。uint16_t定义变量地址要2字节对齐。uint32_t定
    发表于 11-23 18:06 11次下载
    STM32 终极字节<b class='flag-5'>对齐</b>解析

    单片机字节对齐

    对齐原则:数据存放的地址需要是其类型长度的整数倍;字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。许多计算机系统对基本
    发表于 12-01 15:21 11次下载
    单片机字节<b class='flag-5'>对齐</b>

    C语言 | 内存对齐01 - 什么是内存对齐

    一、前言在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。二、内存对齐先看如下代码:结构体Test1占用了多少字节?如果事先
    发表于 01-13 15:18 0次下载
    C语言 | 内存<b class='flag-5'>对齐</b>01 - 什么是内存<b class='flag-5'>对齐</b>

    嘉立创EDA PCB设计对齐与等间距操作

    其他类设计软件通常是通过网格来对齐元件、过孔、走线的,嘉立创EDA提供非常方便的对齐功能 ,如 图1所示,可以对选中的元件、过孔、走线等元素实行向上对齐、向下对齐、向左
    的头像 发表于 03-30 07:40 2596次阅读

    为什么要结构体对齐?为什么结构体对齐那么重要?

    C语言结构体对齐问题,是面试必备问题。我参与招聘技术面试的时候,也喜欢问这个技术点。
    的头像 发表于 05-26 14:10 658次阅读
    为什么要结构体<b class='flag-5'>对齐</b>?为什么结构体<b class='flag-5'>对齐</b>那么重要?

    用户代码移植到STM32芯片时发生非对齐错误怎么办

    数据访问的对齐要求不那么严格,即使非对齐访问也可以支持,当然可能会牺牲访问效率。而对于Cortex-M0/M0+的芯片则明确不支持对数据
    的头像 发表于 09-09 15:48 1002次阅读
    用户代码移植到STM32芯片时发生非<b class='flag-5'>对齐</b>错误怎么办