Trong câu trả lời đầu tiên here, sau đây đã được đề cập về bộ nhớ stack trong C++:C++: Trình biên dịch biết bao nhiêu bộ nhớ để cấp phát cho mỗi khung ngăn xếp?
Khi một hàm được gọi, một khối được dành riêng trên đỉnh của ngăn xếp cho các biến địa phương và một số dữ liệu sổ sách kế toán.
Điều này làm cho cảm giác hoàn hảo trên-cấp cao nhất, và làm cho tôi tò mò về cách trình biên dịch thông minh được khi phân bổ bộ nhớ này trong và của chính nó, trong bối cảnh this question: Kể từ khi niềng răng mình không phải là một stack frame trong C (Tôi cho rằng điều này cũng đúng với C++), tôi muốn kiểm tra xem các trình biên dịch có tối ưu bộ nhớ được dành riêng dựa trên các phạm vi biến trong một hàm duy nhất hay không.
Sau đây tôi giả định rằng chồng trông như thế này trước khi gọi hàm:
--------
|main()|
-------- <- stack pointer: space above it is used for current scope
| |
| |
| |
| |
--------
Và rồi sau khi gọi một hàm f()
:
--------
|main()|
-------- <- old stack pointer (osp)
| f() |
-------- <- stack pointer, variables will now be placed between here and osp upon reaching their declarations
| |
| |
| |
| |
--------
Ví dụ, đưa ra chức năng này
void f() {
int x = 0;
int y = 5;
int z = x + y;
}
Có lẽ, điều này sẽ chỉ phân bổ 3*sizeof(int)
+ một số chi phí bổ sung để ghi sổ kế toán.
Tuy nhiên, những gì về chức năng này:
void g() {
for (int i = 0; i < 100000; i++) {
int x = 0;
}
{
MyObject myObject[1000];
}
{
MyObject myObject[1000];
}
}
Bỏ qua tối ưu hóa trình biên dịch có thể bõ mẫu âm chót rất nhiều thứ ở trên kể từ khi thực sự họ không làm gì cả, tôi tò mò về sau trong ví dụ thứ hai:
- Đối với vòng lặp
for
: không gian ngăn xếp đủ lớn để phù hợp với tất cả 100000 int không? - Trên hết, vùng ngăn xếp có chứa
1000*sizeof(MyObject)
hoặc2000*sizeof(MyObject)
không?
Nói chung: trình biên dịch có tính đến phạm vi biến đổi khi xác định dung lượng bộ nhớ cần cho khung ngăn xếp mới, trước khi gọi hàm nhất định không? Nếu đây là trình biên dịch cụ thể, làm thế nào để một số trình biên dịch nổi tiếng làm điều đó?
Một cặp '{}' là một phạm vi. Vòng lặp reuses cùng một bộ nhớ cho 'x', và hai mảng' myObject' không tồn tại cùng một lúc. – LogicStuff
Tại sao cần phân bổ không gian cho '100000' ints, khi nó có thể tái sử dụng cùng một không gian? Cũng vậy với mảng. –
Trình biên dịch kiểm tra từng phạm vi chức năng và không gian dành riêng là tối đa không gian của tất cả các phạm vi có thể tồn tại cùng một lúc. –