棧空間受限情況下C/C++函式呼叫注意事項
C/C++是基於堆疊的語言,呼叫引數、區域性變數都定義在棧上。當棧空間受限時,需要仔細斟酌。
首先說說個人對棧的理解,受不同編譯器、函式呼叫方式等等因素影響,棧具體實現稍有區別,但是不影響我們對棧佈局的理解。
根據上圖,有以下建議:
1、函式呼叫
a、一個函式,不宜多於3個引數,不應多於5個引數。
如果超出,首先應該檢查程式碼,是否函式職責過重,是否可拆分。
如果無法重構函式,建議定義1個結構體,將引數集中到結構體內再行傳遞。
b、如果函式接受複雜資料,建議宣告為const指標或者const引用。
這樣在引數壓棧時只是傳入一個地址,減少棧消耗,減少資料拷貝。
使用const是為了避免函式的副作用。
2、函式內注意避免過大的區域性變數。
因為區域性變數在棧上分配,頻繁定義巨大的區域性變數,有棧溢位的風險。
3、避免遞迴。
遞迴深度不易控制,容易導致棧溢位。
參考資料:
關於堆疊的講解
https://blog.csdn.net/yingms/article/details/53188974淺談C/C++堆疊指引
https://www.cnblogs.com/findumars/p/7545818.html
林銳的高質量C/C++程式設計(這個自己去搜吧,推薦每個C/C++開發人員都應該讀一下)
相關文章
- C++函式呼叫棧從何而來C++函式
- 函式注意事項函式
- C++ queue的注意事項C++
- 【C++注意事項】3 引用C++
- C語言函式呼叫棧C語言函式
- setbuf函式使用注意事項函式
- 函式呼叫與空間分配函式
- 【C++注意事項】4 指標 PointersC++指標
- 函式呼叫棧函式
- C++名稱空間與友元函式薦C++函式
- 空函式有參函式呼叫引數的注意事項Swift 1.1語言函式Swift
- c++中使用建構函式初始化列表的情況C++函式
- Ignite自定義函式注意事項函式
- 【C++注意事項】7 Library vector TypeC++
- C++如何解析函式呼叫C++函式
- C++中函式呼叫的用法C++函式
- 達夢表空間管理注意事項總結
- Python: 受限制的 "函式呼叫"Python函式
- Spring宣告式事務注意點,以及不生效情況Spring
- 建構函式,拷貝賦值函式的N種呼叫情況函式賦值
- 【C++注意事項】6 Library string TypeC++
- 使用c++中string類的注意事項C++
- 使用find_in_set()函式的注意事項函式
- java呼叫kotlin注意事項JavaKotlin
- C++入門教程(11):呼叫函式C++函式
- 使用ctypes呼叫系統C API函式需要注意的問題,函式引數中有指標或結構體的情況下最好不要修改argtypesAPI函式指標結構體
- 在什麼情況下Java比C++快?JavaC++
- [C++]顯示呼叫建構函式和解構函式C++函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- 【C++注意事項】2 變數宣告和定義C++變數
- c++回撥函式(下)C++函式
- Power Apps SortByColumns 函式使用注意事項APP函式
- 使用箭頭函式的幾個注意事項函式
- C/C++_兩種函式不能過載的情況C++函式
- 在什麼情況下,Java比C++慢很多?JavaC++
- Android C++層列印呼叫棧AndroidC++
- 函式呼叫棧的問題函式
- 函式棧幀(呼叫過程)函式