新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 高效的C編程之: 變量類型

高效的C編程之: 變量類型

作者: 時(shí)間:2013-09-30 來源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/257017.htm

14.8.3全局變量

1.邊界對齊

對于RISC體系結(jié)構(gòu)的處理器來說,訪問邊界對齊的數(shù)據(jù)要比訪問非對齊的數(shù)據(jù)更高效。表14.3顯示了結(jié)構(gòu)下各數(shù)據(jù)類型所占的字節(jié)數(shù)。

表14.3 各數(shù)據(jù)類型所占字節(jié)數(shù)

C數(shù)據(jù)類型

所占字節(jié)數(shù)

char,singedchar,unsignedchar

1

short,unsignedshort

2

int,unsignedint,long,unsignedlong

4

float

4

double

4

longlong

4

變量定義雖然很簡單,但是也有很多值得注意的地方。先看下面的例子。

定義1:

chara;

shortb;

charc;

intd;

定義2:

chara;

charc;

shortb;

intd;

這里定義的4個(gè)變量形式都一樣,只是次序不同,卻導(dǎo)致了在最終映像中不同的數(shù)據(jù)布局,如同14.1所示,其中pad為無意義的填充數(shù)據(jù)。

圖14.1變量在數(shù)據(jù)區(qū)里的布局

從圖中可以看出,第二種方式節(jié)約了更多的存儲器空間。

由此可見,在變量聲明的時(shí)候需要考慮怎樣最佳的控制存儲器布局。當(dāng)然,在一定程度上能夠優(yōu)化這類問題,但最好的方法還是在編譯的時(shí)候把所有相同類型的變量放在一起定義。

2.訪問外部變量

首先來看一個(gè)例子。下面的例子定義了一些全局變量,在main()中為這些變量賦值并將其打印輸出。

/************

*access.c*

************/

#includestdio.h>

chartx;

charrx;

charbyte;

charc;

unsignedstate;

unsignedflags;

intmain()

{tx=1;

rx=2;

byte=3;

c=4;

state=5;

flags=6;

printf(%u%u%u%u%u%un,tx,rx,byte,c,state,flags);

return0;

}

使用編譯,生成的代碼大小如下。

C$$code132

C$$data12

如果將全局變量聲明為extern,變量的定義在其他文件中,那么生成的代碼量將有所增加。

將全局變量聲明為extern,生成的代碼大小如下。

C$$code168

C$$data12

這是因?yàn)楫?dāng)將變量聲明為extern后,每次訪問變量都將從內(nèi)存重新加載,而不是使用內(nèi)存偏移,直接訪問。

下圖顯示對聲明為extern變量的訪問。

解決的辦法是將要從外部引用的extern變量定義在一個(gè)結(jié)構(gòu)體中。在程序中通過結(jié)構(gòu)體訪問外部變量。具體用法如下例所示。

/*************

*globals.h*

*************/

/*DECLARATIONSofglobals-includedinallsources*/

#ifdef__arm

structglobs

{chartx;

charrx;

圖14.2對extern變量的訪問

c語言相關(guān)文章:c語言教程




關(guān)鍵詞: C編程 變量類型 armcc ARM 編譯器

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉