2017-06-19 79 views
3

我明白,最好不要在C中使用寄存器變量,除非你有特別的理由認爲你正在做出比現代編譯器更好的決定。C函數中的靜態局部變量是否會影響執行速度?

由於本地靜態變量停留在函數調用之間,因此在執行速度很重要時使用這些變量是否有意義?

我正在研究一個6502仿真器(只是爲了好玩和學習)。大多數仿真操作根本不需要局部變量,但有一些操作。我在下面貼了一個例子。基本上,我想知道是否將這些變量聲明爲靜態會有任何好處。不要在函數調用之間保留它們的值,而是爲了防止每次都重新分配它們的存儲空間。這是另一種情況,最好把它留給編譯器嗎?

static void 
op_asl_zero_page_x (CPU *cpu) 
{ 
    unsigned int result; 
    Word addr; 
    Byte b; 

    addr = zero_page_addr_XX (cpu, cpu->x); 
    b = bus_read (cpu->bus, addr); 

    /* Copy highest bit to carry */ 
    cpu->status[CPU_STATUS_C] = ((b & 0x80) != 0); 

    result = (unsigned int)b << 1; 
    bus_store (cpu->bus, addr, result); 
    cpu_set_N_Z (cpu, result); 
} 

感謝提前:)

+1

但'靜態'和非靜態變量有不同的語義?他們的一生是不同的。不完全可以互換。 –

+5

這是*過早優化*的另一種情況。您只在*確定*(無疑)性能問題後才進行優化。也就是說,我認爲CPU的堆棧指針改變了多少字節並不重要,因此,不,局部變量(在典型的基於堆棧的實現中)不會變慢。 –

+0

使變量靜態會使代碼更難閱讀,更難以調試,並會創建一個非常有趣的錯誤來源。我非常懷疑潛在的速度改進(如果有的話)可以彌補這些缺點。 – zoul

回答

7

在一個典型的x86系統,當你輸入一個函數,則在爲局部變量保留空間沒有額外的計算成本。

輸入函數意味着移動堆棧指針。移動它8個字節並不比移動它16個字節便宜。這與裝配說明的順序相同。

用起來比較內存,在棧中,但除非你打算做一些嚴重的深遞歸,你不應該擔心。所有這些假設您的編譯器實際上決定使用堆棧來存儲這些變量的內容(它們可能會映射到寄存器)。

因此,就計算而言,沒有成本。在內存方面,成本很低。

+0

謝謝,slezica和其他人。我對編譯器的工作方式非常模糊,但這是一種能夠幫助我學習的項目。你的回答澄清了一些東西:) –

+2

除此之外:'static'存儲時間意味着變量在程序的完整執行時間內持續存在,所以如果編譯器無法優化其使用情況,則需要在內存中存儲/訪問變量遠。如果沒有'static',可以使用寄存器。 –

0

我認爲聲明函數爲靜態只是告訴編譯器這個函數只能用在當前文件(xxx.o)中,並沒有其他的好處。

+1

不正確,'static'存儲類指定了連接*和*存儲時間,請參閱[我的答案](https://stackoverflow.com/a/44614284/2371524)。 Plus OP是在談論變量,而不是函數本身。 –

相關問題