2011-08-18 23 views
12

Tùy thuộc vào trình biên dịch đoạn mã sau:Yêu cầu chính xác về thời gian lưu trữ tự động là gì?

int main() 
{ 
    srand(0); 
    if(rand()) { 
     char buffer[600 * 1024] = {}; 
     printf(buffer); 
    } else { 
     char buffer[500 * 1024] = {}; 
     printf(buffer); 
    } 
    return 0; 
} 

khi chạy trên một hệ thống với chồng tối đa kích thước bằng 1 megabyte hoặc in một chuỗi rỗng hoặc tai nạn với một chồng tràn.

Sự khác biệt là do các trình biên dịch khác nhau phân bổ lưu trữ tự động khác nhau. Hầu hết các trình biên dịch phân bổ lưu trữ for all objects on function start, vì vậy trong đoạn mã trên chúng phân bổ 600 + 400 = 1100 kilobyte và dẫn đến tràn ngăn xếp. Một số trình biên dịch thông minh hơn và họ thấy rằng hai mảng này không bao giờ có thể truy cập được cùng một lúc để chúng tái sử dụng cùng một bộ nhớ và chỉ cấp phát 600 kilobyte và chương trình chạy tốt.

Hiện tại tiêu chuẩn cho biết (3.7/1) thời gian lưu trữ xác định tuổi thọ tối thiểu tiềm năng của bộ nhớ và sau đó (3.7.2/1) bộ nhớ cho các đối tượng này [với thời lượng tự động] kéo dài cho đến khi khối trong đó chúng được tạo ra tồn tại.

Tôi không hiểu cách áp dụng 3.7/1 và 3.7.2/1 cùng nhau. Một người nói rằng thời lượng là tiềm năng tối thiểu và người kia nói rõ ràng rằng nó kéo dài cho đến khi khối tồn tại. Dường như theo cả hai chiến lược phân bổ đầu tiên là hợp pháp, nhưng yêu cầu thứ hai chỉ sử dụng chiến lược phân bổ "tái sử dụng".

Làm thế nào để 3.7/1 và 3.7.2/1 cùng tồn tại? Có hợp pháp để cấp phát bộ nhớ nhiều hơn nhu cầu của chương trình trong trường hợp xấu nhất (chiến lược đầu tiên) không?

+3

1 thú vị câu hỏi. – Sean

+5

Tôi đọc 3.7/1 khi nói "theo định nghĩa, _storage duration_ chỉ định mức tối thiểu" và 3.7.2/1 khi nói "thời lượng lưu trữ cho biến tự động là cho đến khi khối bao quanh thoát". Vì vậy, tôi nghĩ rằng không có mâu thuẫn và một trong hai chiến lược được cho phép. (Thật vậy, việc thực hiện thu gom rác trong thực tế giữ mọi thứ trên đống có thể được cho phép.) – Nemo

Trả lời

6

"Kéo dài đến" cũng là mức tối thiểu.

+0

Vì vậy, tôi có đọc cả hai "thời hạn tối thiểu cho đến khi khối kết thúc" không? – sharptooth

+0

Chính xác. Lưu ý rằng ngay cả khi nó sẽ được nếu không, có _still_ sẽ không có yêu cầu cho trình biên dịch để tái sử dụng vị trí lưu trữ ở cơ hội đầu tiên có thể. – MSalters

7

Tôi đọc 3.7/như mô tả giới thiệu và định nghĩa của lưu trữ khác nhau (tự động, tĩnh, động) và không phải là yêu cầu thực hiện cho từng ... yêu cầu thực hiện cho automatich sau đó được mô tả trong 3.7.2/1.

Reading 3.7.2/1 nó không cấm mà nó tồn tại lâu hơn khối tồn tại (có nghĩa là chỉ ở mức tối thiểu) - IMHO này là một khe hở cho implementors biên dịch về tối ưu hoá khả năng ...

Các vấn đề liên quan