棧空間受限情況下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語言函式呼叫棧C語言函式
- 函式呼叫與空間分配函式
- Ignite自定義函式注意事項函式
- 函式呼叫棧函式
- C++中函式呼叫的用法C++函式
- C++如何解析函式呼叫C++函式
- Power Apps SortByColumns 函式使用注意事項APP函式
- java呼叫kotlin注意事項JavaKotlin
- 達夢表空間管理注意事項總結
- c++中使用建構函式初始化列表的情況C++函式
- C++入門教程(11):呼叫函式C++函式
- 建構函式,拷貝賦值函式的N種呼叫情況函式賦值
- 使用ctypes呼叫系統C API函式需要注意的問題,函式引數中有指標或結構體的情況下最好不要修改argtypesAPI函式指標結構體
- C++:建構函式的分類和呼叫C++函式
- 函式呼叫棧的問題函式
- 函式棧幀(呼叫過程)函式
- C++名稱空間C++
- C++函式C++函式
- C中memcpy使用注意事項memcpy
- C++ 反彙編:關於函式呼叫約定C++函式
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- ES6中箭頭函式使用的注意事項函式
- c++ Beep函式C++函式
- c++函式模板C++函式
- C程式函式呼叫&系統呼叫C程式函式
- Win10系統C盤空間滿了怎麼清理?Win10系統清理C盤注意事項Win10
- c++系列:匿名名稱空間C++
- 溫故之C# using注意事項C#
- C++類將函式模板宣告為友元 例項C++函式
- c++ 函式指標C++函式指標
- 函式回撥(C++)函式C++
- c++的remove函式C++REM函式
- C++之memset函式C++函式
- C++解構函式C++函式