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

2021-09-26 20:08:08 字數 547 閱讀 9030

c/c++是基於堆疊的語言,呼叫引數、區域性變數都定義在棧上。當棧空間受限時,需要仔細斟酌。

首先說說個人對棧的理解,受不同編譯器、函式呼叫方式等等因素影響,棧具體實現稍有區別,但是不影響我們對棧布局的理解。

根據上圖,有以下建議:

1、函式呼叫

a、乙個函式,不宜多於3個引數,不應多於5個引數。

如果超出,首先應該檢查**,是否函式職責過重,是否可拆分。

如果無法重構函式,建議定義1個結構體,將引數集中到結構體內再行傳遞。

b、如果函式接受複雜資料,建議宣告為const指標或者const引用。

這樣在引數壓棧時只是傳入乙個位址,減少棧消耗,減少資料拷貝。

使用const是為了避免函式的***。

2、函式內注意避免過大的區域性變數。

因為區域性變數在棧上分配,頻繁定義巨大的區域性變數,有棧溢位的風險。

3、避免遞迴。

遞迴深度不易控制,容易導致棧溢位。

受限情況下的程式除錯

平台不支援,例如 之前使用一款rk的晶元,晶元原廠告知不支援gdb除錯,原廠未移植成功。資源受限,例如 低端產品資源不足或者缺失關鍵資源 記憶體,儲存空間或者cpu效能不足,物理介面只有串列埠等 導致gdb無法執行。特殊時期,產品無法使用gdb除錯,例如 測試,生產,售後時期都無法再通過gdb除錯。...

運算放大電路 運算放大電路什麼情況下需要調零

在設計電路時,常常會用到運放,很多人對運放的使用還是有些陌生的。其中調零電路,有時候會被認為是雞肋。究竟什麼情況下需要用到運放調零?首先,我們看看,為什麼要調零 為了提高電路的運算精度,要求對失調電壓和失調電流造成的誤差進行補償,這就是運算放大器的調零。常用的調零方法有內部調零和外部調零,而對於沒有...

什麼是棧封閉?什麼情況下物件引用的棧封

1.什麼是棧封閉?答 棧封閉是執行緒封閉的一種特例,在棧封閉中,只能通過區域性變數才能訪問物件。它們位於執行執行緒的棧中,其他執行緒無法訪問這個棧。棧封閉 是實現 執行緒封閉 的機制之一,而 執行緒封閉 和執行緒安全性相關。2.什麼情況下物件引用的棧封閉性會被破壞 破壞掉的後果是什麼?答 1 pri...