我最近一直在開發一些C語言的嵌入式軟件,用於微控制器,它只有2kB的閃存。即將結束編程,我一直在觸及代碼限制。直到現在,當這種情況發生時,我一直在提高編譯器優化的水平,重新測試,然後愉快地繼續。但是,最近我達到了優化的極限,並增加了最後一點功能,再次耗盡內存。結果,我不得不讓喬治福爾曼出現在我的源代碼中,並耗盡一些脂肪。通過分解無效指針大幅降低編譯代碼大小
我在這裏和那裏減少了一些抽象層,這有點幫助了一些事情,但還不夠。我看到了接下來的事情是,我不得不函數原型
void process_event(Event event, void *data);
其作爲它的參數來處理事件和可以用來傳遞額外的數據呼叫空指針。如果我不需要任何額外的數據,我通過了NULL
。這個功能很早就寫在開發中,我意識到我從來沒有使用過data
,所以我將它分解了。這一個改變給我編譯的代碼大小節省了我需要的(〜100字節),我想知道爲什麼,特別是考慮到我通常在調用process_event
時通過NULL
?
函數調用了多少次?通過刪除參數實現的代碼節省是多少? – simonc
該功能被稱爲相當數量(> 10倍)。 –
這可能很大程度上取決於「事件」,它的大小和結構。您可能會遇到您的體系結構的邊界,其中額外的參數會對調用約定進行更改。沒有'數據'「全部在寄存器中」,「溢出堆棧」或類似的東西。 –