棧空間受限情況下C/C++函式呼叫注意事項

whatnamecaniuse發表於2018-04-02

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++開發人員都應該讀一下)


相關文章