C語言中變數的位置與程式優化

2021-04-02 06:47:03 字數 961 閱讀 8732

前幾天乙個朋友在網上問我:「怎麼區分全域性變數,靜態變數和自動變數?」我覺得奇怪,他怎麼問乙個初學者的問題,我這位朋友其實程式設計挺厲害的,呵呵。接著他說是:「計算機怎麼區分」。確實,人區分各種變數一看就知道了,但是計算機怎麼區分呢?沒有編譯知識可能一下子也難弄懂。

計算機理解力是沒法和我們相比的,但是它比我們快。我們可以把這些變數分開來放,從不同地方取來的就是不同的變數。告訴計算機去找的就是符號表。當然,生成符號表是編譯器的事,我們不用管。但是了解一點總是有好處的。這裡我以unix elf(executalbe and linkable format)格式檔案為例說明編譯器是怎麼安排全域性變數,靜態變數和自動變數的位置的。

elf可重定位目標檔案包括:elf頭以及.text,.rodata, .data ,.bss ,.symtab, .rel.text, .rel.data 等節。

全域性變數:已初始化的儲存在.data段中 ,未初始化的表示為.bss段的乙個佔位符;

靜態變數:根據是否初始化分別在.data 和.bss段中分配空間;

自動變數(非靜態區域性變數):在執行時儲存在棧中。既不在.data 段中也不在.bss段中。

其實我們可以編寫乙個簡單的程式,編譯了以後用objdump命令檢視各種變數所在的節。

知道了各種變數在執行時的位置也就知道了他們的儲存期,而且了解變數的位置對編寫高效能程式也非常有幫助。

我們知道嵌入式對程式的效能要求是非常高的,函式的引數列表越長那麼函式呼叫的開銷就越大,這個時候我們可以使用全域性變數提高程式的效能。

將函式和變數宣告為static可防止函式和變數被其它模組不正確的使用。

關於自動變數,請看下面的兩個程式:

long product;

void factoriala(long n)

void factorialb(long n)

product = x;

}在n值較大的時候,上面兩個程式的效能是有顯著差別的。 這是利用了程式的區域性性原理。

C語言中的變數的儲存位置

變數的預設儲存型別取決於它的申明位置。凡是在任何 塊之外宣告的變數總是儲存在靜態記憶體中。不屬於堆疊記憶體,這類變數稱為靜態變數。靜態變數在函式執行之前建立。在 塊內部宣告的變數的預設儲存型別是自動的,儲存在堆疊中。對於在 塊內部宣告的變數,如果給它加上 static 關鍵字,可以使它的儲存型別由自...

C語言中的變數

開場白要吸引人.但是我不會 有人說我可以靠臉吃飯。可我偏偏選擇了手,哈哈哈 說笑 娛樂娛樂,下面我就來提提c語言中關於變數的意思 什麼是變數?沒錯 你看字面意思就可以理解,就是可以變得量,用專業一點的話就是程式中其值可以變化的量。變數有三個基本要素 變數名 每乙個變數都應該有乙個名字。變數的資料型別...

C語言中的變數

一.普通區域性變數 區域性變數無論是否靜態均不允許同名,否則會出現error 當區域性變數與全域性變數同名時,依據就近原則進行判斷。區域性變數同名是指在復合語句的巢狀中,內層復合語句變數與外層復合語句變數同名,這樣是允許的。二.普通全域性變數 全域性變數無論是否靜態都不允許同名,否則編譯器會給出er...