C語言中變量的位置與程序優化

轉自:http://blog.csdn.net/wenxin1004/archive/2005/12/13/551371.aspx

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

        計算機理解力是沒法和我們相比的,但是它比我們快。我們可以把這些變量分開來放,從不同地方取來的就是不同的變量。告訴計算機去找的就是符號表。當然,生成符號表是編譯器的事,我們不用管。但是瞭解一點總是有好處的。這裏我以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)
{
        long i;
        for(i = 1; i <= n;i++ ){
        product *= i;
    }
void factorialB(long n)
{
        long i;
        long x = 1;
        for(i = 1; i <= n;i++ ){
                 x *= i;
        }
        product = x;
}
        在n值較大的時候,上面兩個程序的性能是有顯著差別的。 這是利用了程序的局部性原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章