Tôi thường không có vấn đề gì trong việc quyết định liệu một số dữ liệu phải là toàn cầu, tĩnh hay trên ngăn xếp (Không phân bổ động ở đây, vì vậy không sử dụng heap). Tôi cũng đã đọc một vài Q / A như câu hỏi này nhưng câu hỏi của tôi cụ thể hơn vì nó liên quan đến một lượng dữ liệu khổng lồ, rất lớn so với bộ nhớ hệ thống.
Tôi đang làm việc với một mã hiện có mà tôi cố gắng cải thiện (thiết kế, các vấn đề có thể xảy ra, hiệu suất, v.v.). Mã này chạy trên MCU 8 bit cũ chỉ với 4KB RAM . Trong mã này, tôi phải đối mặt với việc sử dụng một mảng gần 1KB (vâng, 1KB trên hệ thống RAM 4KB ). Mỗi byte của mảng này được sử dụng, đó không phải là câu hỏi. Vấn đề là mảng này là một mảng tĩnh trong tệp nơi nó được khai báo, vì vậy vòng đời của nó giống như chương trình (nghĩa là có thể được coi là vô hạn).
Tuy nhiên, sau khi đọc mã, tôi phát hiện ra rằng mảng này không cần vòng đời vô hạn, nó được xây dựng và xử lý theo cách thủ tục đầy đủ, vì vậy chúng ta chỉ có thể khai báo nó trong hàm mà nó được sử dụng, bằng cách này, nó sẽ nằm trên ngăn xếp và do đó chúng tôi sẽ tiết kiệm được 1KB RAM này.
Bây giờ câu hỏi: Đây sẽ là một ý tưởng tốt? Từ quan điểm thiết kế, nếu nó không cần vòng đời vô hạn / toàn cầu, thì nó thuộc về ngăn xếp. Nhưng này, đó là 1KB trong số 4KB, không có bất kỳ nhược điểm nào trong việc phân bổ 25% RAM như thế này? (có thể là 50% hoặc nhiều hơn của ngăn xếp)
Ai đó có thể chia sẻ một số kinh nghiệm với loại tình huống này, hoặc ai đó nghĩ về bất kỳ lý do hợp lệ nào để không đưa mảng này vào ngăn xếp? Tôi đang tìm kiếm những hạn chế kỹ thuật cũng như nhận xét về thiết kế.
Điều duy nhất tôi có ý thức là tôi phải đảm bảo rằng tôi thực sự có 1KB ngăn xếp miễn phí khi vào chức năng này. Có lẽ đó là tất cả những gì tôi phải quan tâm, có thể không.