<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > EDA/PCB > 設計應用 > 針對嵌入式SoC應用的C編程優(yōu)化

針對嵌入式SoC應用的C編程優(yōu)化

作者: 時(shí)間:2012-05-02 來(lái)源:網(wǎng)絡(luò ) 收藏

5. 使用本地變量替代全局變量

這是因為全局變量會(huì )在整個(gè)程序的生命周期里面保留數值。編譯器必須認為全局變量可能通過(guò)指針被訪(fǎng)問(wèn)??紤]下面的代碼:

int g;

void foo()

{

int i;

for (i=0; i100; i++){

fred(i,g);

}

}

理想情況下,g在每次fred循環(huán)時(shí)被加載一次,并且它的值將被傳遞到一個(gè)寄存器里面給fred函數使用。但是,編譯器不知道fred是否會(huì )修改g 的值。如果fred不會(huì )修改g的值,你應該像下面一樣,使用本地變量。這樣做可以避免每次調用fred函數時(shí)加載g到一個(gè)寄存器里面。

int g;

void foo()

{

int i, local_g=g;

for (i=0; i100; i++){

fred(i,local_g);

}

}

6. 針對數據結構使用正確的數據類(lèi)型

C編程人員對于數據類(lèi)型一般都會(huì )有他們習慣上的假設,但是編譯器卻需要很謹慎地對待這些假設。比如,在幾乎所有現代的計算機架構上,一個(gè) unsigned char使用8位表示從0到255。一個(gè)C程序會(huì )假設對值為255的unsigned char加1會(huì )使其變?yōu)?。而實(shí)際上,現代32位處理器是不會(huì )執行上述的那種8位加法,而是進(jìn)行32位數值的加法。因此,如果一個(gè)unsigned char的本地變量進(jìn)行加法,編譯器必須使用多條指令進(jìn)行運算以保證加法后的符號擴展。因此,針對各種變量尤其是循環(huán)索引的變量,應該盡量多的在可以的地方使用int型變量。

另外,許多處理器有16位乘法指令,而缺少32位乘法指令。在這種情況下,32位乘法將被仿效執行,一般情況下都是很慢的。如果數據被執行乘法操作并且計算結果不會(huì )超過(guò)16位的精度,那么就使用short或者unsigned short變量。

7. 不要用不直接的調用

這是通過(guò)包含傳遞參數的函數指針的調用,因為那會(huì )產(chǎn)生不可預知的邊際效應(比如修改全局變量),使得優(yōu)化難以進(jìn)行。

8. 編寫(xiě)返回數值的函數而不是返回指針的函數

9. 傳遞變量時(shí)使用數值而不是指針或者全局變量

傳遞大結構的數據時(shí),才使用指針。每個(gè)通過(guò)數值被傳遞的結構都應該在函數調用入口處被完全拷貝存儲過(guò)。

10. 使用變量的地址會(huì )使程序性能降低

因為本地變量的地址會(huì )引起混淆,這如同全局變量一樣。

11. 用const聲明指針參數

如果函數體內不會(huì )修改到指針指向的對象,就要用const聲明指針參數,這樣可以讓編譯器避免不必要的反面假設。

12. 使用數組而不是指針,考慮下面通過(guò)指針訪(fǎng)問(wèn)數組的代碼

for (i=0; i100; i++)

*p++ = ...

在每次循環(huán)中,*p被賦值。這種對指針對象的賦值會(huì )阻礙優(yōu)化。某些情況下,指針指向它自己,那么這種賦值就會(huì )修改指針本身的值,這就會(huì )強迫編譯器每次循環(huán)都重新加載該指針。還有,編譯器不能確定這個(gè)指針不會(huì )被循環(huán)體以外的使用,所以每次循環(huán)外都要依據增量的數值更新該指針。因此,最好使用下面的代碼:

for (i=0; i100; i++)

p[i] = ...

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: SoC 嵌入式 編程優(yōu)化

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>