編碼:
//function prototype
void efg(int x);
//mother functioon
abc()
{
int a=1;
efg(a);
}
當efg正在執行時,改變x并沒有改變,a那么我們有一個a. 但是如果我們不希望副本有效地使用記憶體怎么辦?
一種方法是傳遞a's 指標&a。
我有一些限制:
- 不想通過任何東西。因為我有大約 20 個變數。
- 不想要它的指標。我想直接訪問它。
- 不想成為全域靜態的。
- 不愿意使用堆動態分配,因為它是嵌入的,它也迫使我使用指標而不是直接訪問。
我希望我的子函式(efg)能夠使用母函式的變數(ain abc)。這意味著efg能夠a直接訪問。為什么不?我也希望在執行完成a后被釋放abc,因為按照解釋的方式,變數在堆疊中,它們將在函式完成后被釋放。
確切的問題是:sub_functions 在記憶體中啟動一些結構。在子函式完成其作業(CPU 回傳母函式)后,記憶體必須保持不變,直到母函式完成(CPU 回傳主函式)并且此處必須釋放記憶體。
我最好的夢想解決方案是在子例程中使用外部變數宣告來使用母函式堆疊。
uj5u.com熱心網友回復:
不想通過任何東西。因為我有大約 20 個變數。
我希望您不打算將 20 個變數傳遞給函式,或者您需要開始將相關變數放在同一個結構中。如果您總共有 20 個變數,那么這與任何事情有什么關系?
不想要它的指標。我想直接訪問它。
如果沒有理由為什么要直接訪問,這沒有任何意義。間接訪問與直接訪問的性能差異是如此之小,以至于人們甚至不應該考慮它。當您實際上有實時限制或瓶頸時手動優化,不要僅僅為了它而優化。
如果您擔心性能,那么一種明智的方法是使用帶有內部鏈接的小函式,這些函式肯定會被編譯器行內。但是請注意,行內是對程式大小優化的執行速度。
不想成為全域靜態的。
這有點矛盾,我假設您的意思是宣告了static指定的存盤類但在檔案范圍內宣告。根據用例,使用這些變數可能是也可能不是有效的設計。對于單核嵌入式系統,這些變數并沒有什么問題。
不愿意使用堆動態分配,因為它是嵌入的,它也迫使我使用指標而不是直接訪問。
是的,在此類系統中,出于多種原因,應避免堆分配。我在這里寫了所有問題的總結:為什么我不應該在嵌入式系統中使用動態記憶體分配?但是,避免間接訪問并不是一個正當理由。
確切的問題是:sub_functions 在記憶體中啟動一些結構。在子函式完成其作業(CPU 回傳母函式)后,記憶體必須保持不變,直到母函式完成(CPU 回傳主函式)并且此處必須釋放記憶體。
因此,通過在堆疊上將變數宣告為本地變數,然后將其地址傳遞給另一個函式來解決這個問題。如果您不希望程式的任何其他部分同時觸及該記憶體,那么只需避免撰寫執行此操作的代碼......
總結:不要突然說出一堆最后通牒,你不能明智地爭論贊成或反對。很明顯,您的程式設計經驗有限,更不用說手動代碼優化了。所以現在你能做的最好的事情是撰寫盡可能可讀的代碼,遵循眾所周知的最佳實踐(常量正確性、私有封裝等)。因為可讀代碼也往往是高效、無錯誤的代碼。而不必要的人為和復雜的代碼往往很慢、有缺陷并且難以維護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524595.html
標籤:C堆嵌入式
上一篇:如何掃描輸入鍵作為輸入
