Có 3 thành phần để sử dụng ngăn xếp của bạn:
- địa chỉ Chức năng Gọi lại
- Chức năng các thông số cuộc gọi
- tự động (cục bộ) biến
Mấu chốt để giảm thiểu mức sử dụng ngăn xếp của bạn là giảm thiểu thông số truyền và các biến tự động. Tiêu thụ không gian của chức năng gọi thực tế chính nó là khá nhỏ.
thông số
Một cách để giải quyết vấn đề tham số là để vượt qua một cấu trúc (thông qua con trỏ) thay vì một số lượng lớn các thông số.
foo(int a, int b, int c, int d)
{
...
bar(int a, int b);
}
làm điều này thay vì:
struct my_params {
int a;
int b;
int c;
int d;
};
foo(struct my_params* p)
{
...
bar(p);
};
Chiến lược này là tốt nếu bạn vượt qua xuống rất nhiều thông số. Nếu các tham số khác nhau, thì nó có thể không hoạt động tốt cho bạn. Bạn sẽ kết thúc với một cấu trúc lớn được truyền xung quanh có chứa nhiều thông số khác nhau.
biến tự động (người dân địa phương)
này có xu hướng người tiêu dùng lớn nhất của ngăn xếp không gian.
- Mảng là kẻ giết người. Không định nghĩa các mảng trong các hàm cục bộ của bạn!
- Giảm thiểu số lượng biến cục bộ.
- Sử dụng loại nhỏ nhất cần thiết.
- Nếu ủy thác lại không phải là vấn đề, bạn có thể sử dụng biến tĩnh mô-đun.
Hãy nhớ rằng nếu bạn chỉ đơn giản di chuyển tất cả các biến cục bộ từ phạm vi cục bộ sang phạm vi mô-đun, bạn KHÔNG lưu bất kỳ dung lượng nào. Bạn đã giao dịch không gian ngăn xếp cho không gian phân đoạn dữ liệu.
Một số bộ nhớ cục bộ hỗ trợ RTOS hỗ trợ lưu trữ "toàn cầu" trên cơ sở theo từng luồng. Điều này có thể cho phép bạn có nhiều biến toàn cầu độc lập trên cơ sở mỗi tác vụ, nhưng điều này sẽ làm cho mã của bạn không đơn giản.
+1 nội tuyến .... tự hỏi liệu trình biên dịch hiện đại có thực hiện tự động không? – kenny