高效的C編程之: 變量類型
14.8變量類型
ARMC編譯器支持基本的數(shù)據(jù)類型:char、short、int、longlong、float和double。表14.2說明了armcc對C語言所使用的數(shù)據(jù)類型的映射。
表14.2 C編譯器數(shù)據(jù)類型映射
C數(shù)據(jù)類型 | 表示的意義 |
char | 無符號8位字節(jié)數(shù)據(jù) |
short | 有符號16位半字?jǐn)?shù)據(jù) |
int | 有符號32位字?jǐn)?shù)據(jù) |
long | 有符號32位字?jǐn)?shù)據(jù) |
longlong | 有符號64位雙字?jǐn)?shù)據(jù) |
ARM指令集中,無論是數(shù)據(jù)處理指令還是數(shù)據(jù)加載/存儲指令,處理的數(shù)據(jù)類型不同,指令的執(zhí)行效率是不一樣的。本章將詳細(xì)討論,如何在程序中為變量分配合理的數(shù)據(jù)類型,來提高代碼的執(zhí)行效率。
14.8.1局部變量
ARM屬于RISC的體系結(jié)構(gòu),所有大多數(shù)的數(shù)據(jù)處理都是在32位的寄存器中進(jìn)行的?;谶@個原因,局部變量應(yīng)盡可能使用32位數(shù)據(jù)類型int或long。
注意 | 一些情況下不得不使用char或short類型,例如要使用char或short類型的數(shù)據(jù)溢出指令時歸零特性時,如模運(yùn)算255+1=0,就要使用char類型。 |
為了說明局部變量類型的影響,先來看一個簡單的例子。
charcharinc(chara)
{
returna+1;
}
編譯出的結(jié)果如下。
charinc
ADDa1,a1,#1
ANDa1,a1,#ff
MOVpc,lr
再把上面的程序段中變量a聲明位int型,代碼如下。
intwordinc(inta)
{
returna+1;
}
比較一下編譯器輸出結(jié)果。
wordinc
ADDa1,a1,#1
MOVpc,lr
分析上面的兩段代碼不難發(fā)現(xiàn),當(dāng)把變量聲明為char型時,編譯器增加了額外的ADD指令來保證其范圍在0~255之間。
14.8.2有符號數(shù)和無符號數(shù)
上一節(jié)討論了對于局部變量和函數(shù)參數(shù),使用int型比使用char或short型要好。本節(jié)將對程序中的有符號整數(shù)(signedint)和無符號整數(shù)(unsignedint)的執(zhí)行效率進(jìn)行分析比較。
首先來看上一節(jié)的例子,如果將變量指定為有符號的半字類型(編譯器默認(rèn)short型為有符號類型),程序的源代碼如下。
shortshortinc(shorta)
{
returna+1;
}
編譯后的結(jié)果如下。
shortinc
ADDa1,a1,#1
MOVa1,a1,LSL#16
MOVa1,a1,ASR#16
MOVpc,lr
分析發(fā)現(xiàn),該結(jié)果比使用int型的變量多增加了兩條指令(LSL和ASR)。編譯器先將變量左移16位,然后右移16位,以實(shí)現(xiàn)一個16位符號擴(kuò)展。右移是符號位擴(kuò)展移位,它復(fù)制了符號位來填充高16位。
通常情況下,如果程序中只有加法、減法和乘法,那么有符號和無符號數(shù)的執(zhí)行效率相差不大。但是,如果有了除法,情況就不一樣了。詳細(xì)內(nèi)容可參加除法運(yùn)算優(yōu)化一節(jié)。
c語言相關(guān)文章:c語言教程
評論