0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)總線寬度:對齊的含義和怎樣去對齊以及帶來的效率差異

Q4MP_gh_c472c21 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-01-30 09:34 ? 次閱讀

最近和同事談到了ARM平臺下數(shù)據(jù)總線寬度及對齊方式對程序效率的影響問題,在定義結(jié)構(gòu)數(shù)據(jù)類型時,為了提高系統(tǒng)效率,要注意字長對齊原則。正好有點感觸和大家一起談?wù)劇?/p>

這里主要給大家解釋下所謂的對齊到底是什么?怎么對齊?為什么會對齊或者說對齊帶來什么樣的效率差異?

對齊的含義和怎樣去對齊以及帶來的效率差異

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<

}

默認(rèn)的vc我記得是4字節(jié)對齊ADS下是一字節(jié)對齊,因為是c/c++社區(qū)大家對PC比較熟悉 我就談PC下的對齊。

PC下設(shè)計放的太長時間的有錯誤就別客氣直接說,大家可以看到在ms的vc下按4字節(jié)對齊和1字節(jié)對齊的結(jié)果是截然不同的分別為8和5為什么會有這樣的結(jié)果呢?這就是x86上字節(jié)對齊的作用。

為了加快程序執(zhí)行的速度,一些體系結(jié)構(gòu)以對齊的方式設(shè)計,通常以字長作為對齊邊界。對于一些結(jié)構(gòu)體變量,整個結(jié)構(gòu)要對齊在內(nèi)部成員變量最大的對齊邊界,如A,整個結(jié)構(gòu)以4為對齊邊界,所以sizeof(a)為8,而不是5。

如果是原始我們概念下的的A中的成員將會一個挨一個存儲,應(yīng)該只有char+int只有5個字節(jié)。這個差異就是由于對齊導(dǎo)致的。,然我們可以看到A的對齊要比B浪費3個字節(jié)的存儲空間。

那為什么還要采取對齊呢?

那是因為體系結(jié)構(gòu)的對齊和不對齊,是在時間和空間上的一個權(quán)衡。

字節(jié)對齊節(jié)省了時間。應(yīng)該是設(shè)計者考慮用空間換取時間。

為什么說對齊會提高效率呢節(jié)省時間?我想大家要理解的重點之重點就在這里了。

在我們常用的PC下總線寬度是32位

1.如果是總線寬度對齊的話

那么所有讀寫操作都是獲取一個<=32位數(shù)據(jù)可以一次保證在數(shù)據(jù)總線傳輸完畢

沒有任何的額外消耗

|1|2|3|4|5|6|7|8|

從1開始這里是a的起始位置,5起始為b的位置 訪問的時候

如果訪問a一次在總線傳輸8位其他24位無效的

訪問b時則一次在總線上傳輸32完成

讀寫均是一次完整

插敘一下 讀操作先要將讀地址放到地址總線上然后下個時鐘周期再從外部

存儲器接口上讀回數(shù)據(jù)通過數(shù)據(jù)總線返回需要兩個周期

而寫操作一次將地址及數(shù)據(jù)寫入相應(yīng)總線就完成了

讀操作要比寫操作慢一半

2.我們看訪問數(shù)據(jù)時如果不對齊地址的情況

|1|2|3|4|5|6|7|8|

此時a的地址沒變還在1而因為是不對齊則b的位置就在2處

這時訪問就帶來效率上問題 訪問a時沒問題還是讀會一個字節(jié)

但是2處地址因為不是總線寬度對齊一般的CPU在此地址操作將產(chǎn)生error

如sparc,MIPS。它們在硬件的設(shè)計上就強制性的要求對齊。在不對齊的地址上肯定發(fā)生錯誤

但是x86是支持非對齊訪問的

它通過多次訪問來拼接得到的結(jié)果,具體做法就是從1地址處先讀回后三字節(jié)234 暫存起來

然后再由5地址處讀回一個字節(jié)5 與234進(jìn)行拼接組成一個完整的int也就是b返回

大家看看如此的操作帶來的消耗多了不止三倍很明顯在字長對齊時效率要高許多

淡然這種效率僅僅是訪問多字節(jié)帶來的 如果還是進(jìn)行的byte操作那效率差不了多少

目前的開發(fā)普遍比較重視性能,所以對齊的問題,有2種不同的處理方法:

1) 有一種使用空間換時間做法是顯式的插入reserved成員:

struct A{

char a;

char reserved1[3]; //使用空間換時間

int b;

}a;

2) 隨便怎么寫,一切交給編譯器自動對齊。

還有一種將邏輯相關(guān)的數(shù)據(jù)放在一起定義

代碼中關(guān)于對齊的隱患,很多是隱式的。比如在強制類型轉(zhuǎn)換的時候。下面舉個例子:

unsigned int i = 0x12345678;

unsigned char *p=NULL;

unsigned short *p1=NULL;

p=&i;

*p=0x00;

p1=(unsigned short *)(p+1);

*p1=0x0000;

最后兩句代碼,從奇數(shù)邊界去訪問unsignedshort型變量,顯然不符合對齊的規(guī)定。

在x86上,類似的操作只會影響效率,但是在MIPS或者sparc上,可能就是一個error

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9097

    瀏覽量

    367610
  • PC
    PC
    +關(guān)注

    關(guān)注

    9

    文章

    2082

    瀏覽量

    154225
  • 數(shù)據(jù)總線
    +關(guān)注

    關(guān)注

    2

    文章

    57

    瀏覽量

    17571

原文標(biāo)題:嵌入式er日常!和同事交流ARM平臺字節(jié)對齊帶來的效率差異

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)據(jù)總線寬度可以配置為24位嗎?

    是否可以將數(shù)據(jù)總線寬度配置為24位?我檢查了8, 16位和32位之間的差異,只改變了最后8位中的第七十九行(CyuU3pIPIBGPGIFIFBuxCONFIG)。我需要24位數(shù)據(jù)
    發(fā)表于 08-21 09:02

    包絡(luò)對齊改進(jìn)算法

    包絡(luò)對齊改進(jìn)算法FFT距離多普勒成像法采用相鄰相關(guān)法做包絡(luò)對齊時,是把前一個距離像作為對準(zhǔn)的基準(zhǔn),因此它的偏差會一直傳播下去。設(shè)第i次
    發(fā)表于 03-02 11:26 ?1659次閱讀
    包絡(luò)<b class='flag-5'>對齊</b>改進(jìn)算法

    什么是數(shù)據(jù)總線寬度/地址總線寬度

    什么是數(shù)據(jù)總線寬度/地址總線寬度? 數(shù)據(jù)總線寬度   數(shù)據(jù)
    發(fā)表于 02-04 10:25 ?6668次閱讀

    詳解C語言字節(jié)對齊

      一、什么是對齊,以及為什么要對齊:   1. 現(xiàn)代計算機中內(nèi)存空間都是按照byte劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是
    發(fā)表于 08-29 10:11 ?1256次閱讀

    ARM內(nèi)存邊界對齊以及sizeof問題

    默認(rèn)情況下,在32位cpu里,gcc對于結(jié)構(gòu)體的對齊方式是按照四個字節(jié)來對齊的。
    發(fā)表于 06-16 11:10 ?2961次閱讀

    基于ARM程序的字節(jié)對齊的分析

    首先說說,什么叫對齊。如果一個數(shù)據(jù)是從偶地址開始的連續(xù)存儲,那么它就是半字對齊,否則就是非半字對齊;半字對齊的特征是bit0=0,其他位為任
    發(fā)表于 09-19 16:04 ?0次下載

    一個跟地址對齊有關(guān)的應(yīng)用異常案例

    也就是說,基于CortexM3內(nèi)核的芯片,它支持部分指令的非對齊訪問,但非對齊訪問要慢于對齊訪問。即非對齊訪問是需要代價的,訪問效率會受到影
    的頭像 發(fā)表于 02-04 15:20 ?2566次閱讀
    一個跟地址<b class='flag-5'>對齊</b>有關(guān)的應(yīng)用異常案例

    固態(tài)硬盤4K對齊操作對齊的到底是什么?為什么它如此重要?

    在購買和使用固態(tài)硬盤的過程中,大家一定都聽說過“注意4K對齊”這個提醒。那么4K對齊到底對齊了什么?為什么它如此重要?
    的頭像 發(fā)表于 06-04 09:03 ?9088次閱讀

    總線寬度總線帶寬的區(qū)別

    很多人把計算機總線寬度總線帶寬混為一談,其實他們是不一樣的。
    發(fā)表于 09-01 09:52 ?1.5w次閱讀

    SSD固態(tài)硬盤對齊的方法

    大家多聽過SSD固態(tài)對齊,或者也試的對齊,怎么看是否對齊呢?
    發(fā)表于 06-25 17:09 ?4137次閱讀
    SSD固態(tài)硬盤<b class='flag-5'>對齊</b>的方法

    CSS對齊方式的詳細(xì)講解

    本文基于Html基礎(chǔ),主要介紹了Html中對齊的方式,對于對齊中的標(biāo)簽做了詳細(xì)的講解,用豐富的案例 ,代碼效果圖的展示,幫助大家更好理解 。
    的頭像 發(fā)表于 12-24 15:38 ?1283次閱讀

    STM32 終極字節(jié)對齊解析

    一、全局變量對齊問題:基本上用戶定義的變量是幾個字節(jié)就是幾字節(jié)對齊,這個比較好理解。uint8_t定義變量地址要1字節(jié)對齊。uint16_t定義變量地址要2字節(jié)對齊。uint32_t定
    發(fā)表于 11-23 18:06 ?11次下載
    STM32 終極字節(jié)<b class='flag-5'>對齊</b>解析

    單片機字節(jié)對齊

    對齊原則:數(shù)據(jù)存放的地址需要是其類型長度的整數(shù)倍;字節(jié)對齊的作用不僅是便于cpu快速訪問,同時合理的利用字節(jié)對齊可以有效地節(jié)省存儲空間。許多計算機系統(tǒng)對基本
    發(fā)表于 12-01 15:21 ?11次下載
    單片機字節(jié)<b class='flag-5'>對齊</b>

    C語言 | 內(nèi)存對齊01 - 什么是內(nèi)存對齊

    一、前言在單片機下使用C語言編程時,內(nèi)存對齊的知識點必須掌握。掌握內(nèi)存對齊后,可以防止內(nèi)存碎片化,單片機有限的內(nèi)存被更加有效地使用。二、內(nèi)存對齊先看如下代碼:結(jié)構(gòu)體Test1占用了多少字節(jié)?如果事先
    發(fā)表于 01-13 15:18 ?0次下載
    C語言 | 內(nèi)存<b class='flag-5'>對齊</b>01 - 什么是內(nèi)存<b class='flag-5'>對齊</b>

    嘉立創(chuàng)EDA PCB設(shè)計對齊與等間距操作

    其他類設(shè)計軟件通常是通過網(wǎng)格來對齊元件、過孔、走線的,嘉立創(chuàng)EDA提供非常方便的對齊功能 ,如 圖1所示,可以對選中的元件、過孔、走線等元素實行向上對齊、向下對齊、向左
    的頭像 發(fā)表于 03-30 07:40 ?3871次閱讀