高效ARM C程式設計 中

2021-07-09 08:33:54 字數 1660 閱讀 4108

你在結構體上的布局安排對提公升效能和**密度有很重要的影響。在arm的結構體上有2個主要的問題:第一種是alignment of the structure entries.第二種是結構體整體的大小。

arm編譯器會自動對齊結構體的開始位址,讓其對齊結構體內最大尺寸的成員。例如:

struct
內部如下

address

+3+2

+1+0

+0pad

padpada+4

b[31,24]

b[23,16]

b[15,8]

b[7,0]

+8d[15,8]

d[7,0]

padc

struct
內部如下

address

+3+2

+1+0

+0d[15,8]

d[7,0]ca

+4b[31,24]

b[23,16]

b[15,8]

b[7,0]

從上面2個例子我們可以得出結論,通過struct內部的變數安排,能夠有效的節省空間和提高速度。

enum的實際大小是由compiler決定的,在armcc中是one byte,但是在gcc中卻是four byte。由於這個不確定性,要避免在struct中使用enum

所有的陣列和很大的元素要盡可能的放在結構體的尾部

如果結構體太大導致無法在一條指令內訪問所有元素,那麼最好的辦法就是將一些元素打包進子結構體中。這樣能提高效率。

typedef

structstages

在乙個需要訪問stagea,stageb,stagec的函式中,compiler訪問包含bit-field的記憶體位址的時候需要訪問3次。這是因為bit-field存放在記憶體中,編譯器不知道其值會不會發生改變。

summary

直接用unsigned long和#define來取代bit-field

涉及到and,or,eor運算子的**是很高效的。

不對齊的訪問是很低效的。在armcc中可以使用_packed int *data來告訴編譯器資料可以以任何的位元組對齊方式。但是會影響效率。

在網路資料報和壓縮的影象檔案(jpeg就是big-endian)中會因為邊界對齊出現問題。two-byte和four-byte整型數可以以任何offset出現在這些檔案中。此外endianness也是讀取資料報和壓縮檔案的重要問題。這個arm core 可以配置為little-endian(least significant byte at lowest address)或者big-endian(least significant byte at biggest address)模式。arm預設的是little-endian模式。

int readint_little(char *data)

int readint_big(char *data)

void read_samples(char * in)

}

盡可能使用對齊的資料

在任何需要位元組對齊的地方使用char *對於要訪問的不對齊的資料,要準備好大小端,是否對齊的多個版本。

arm c中位元組對齊

align關鍵字指示編譯器在n位元組邊界上對齊變數。align是乙個儲存類修飾符。它不影響函式的型別。語法 align n 其中 n 是對齊邊界。對於區域性變數,n值可為 1 2 4 或 8。對於全域性變數,n可以具有最大為 2 的 0x80000000 次冪的任何值。align關鍵字緊靠變數名稱前...

python 高效程式設計

有時候,我們需要在兩台機器或服務之間做一些簡便的 很基礎的rpc之類的互動。我們希望用一種簡單的方式使用b程式呼叫a程式裡的乙個方法 有時是在另一台機器上。僅內部使用。我並不鼓勵將這裡介紹的方法用在非內部的 一次性的程式設計中。我們可以使用一種叫做xml rpc的協議 相對應的是這個python庫 ...

高效C 程式設計

推薦編寫c 的 風格,看似容易,堅持不易,且寫且珍惜!陳國林 1.版本和版本宣告 版本和版本檔案宣告位於標頭檔案和定義檔案的開頭,主要內容 1 版本資訊 2 檔名稱 識別符號 摘要 3 當前的版本號 作者 修改日期 4 版本歷史資訊 2.程式版式 1 在每個類宣告之後 每個函式定義之後都要加上乙個空...