2016-06-03 17 views
5

Tại sao khi biên dịch Sample 1, nó sử dụng tất cả RAM của tôi và treo máy tính của tôi chưa Sample 2 biên dịch ngay lập tức mà không làm như vậy?Sử dụng bộ nhớ cực lớn với các mảng lớn của một đối tượng

Mẫu 1:

class Foo 
{ 
    int a = 0; 
}; 

class Test 
{ 
    Foo foo[4000000] = {}; 
}; 

int main() 
{ 
    Test t; 
} 

Mẫu 2:

class Foo 
{ 
    int a = 0; 
}; 

int main() 
{ 
    Foo foo[4000000] = {}; 
} 

Cuối cùng, là có cách nào để ngăn chặn Mẫu 1 từ việc sử dụng tấn RAM khi biên dịch? Tôi đang sử dụng gcc version 5.3.0 và tôi đã biên soạn ở trên với -std=c++11. Lưu ý rằng class Test chỉ yêu cầu bộ nhớ 16 MB.

Đối với bất kỳ

+0

'nó sử dụng tất cả RAM của tôi và làm hỏng máy tính của tôi' Nếu GCC thực hiện điều đó, đó rõ ràng là lỗi trình biên dịch. – user6412786

+0

Hấp dẫn. Tôi sẽ đoán rằng gcc đang cố gắng tạo một hàm tạo cho đối tượng bằng cách tạo mã để khởi tạo mỗi một trong bốn triệu cá thể của 'Foo' trong lớp' Test'. Dunno tại sao gcc không thể làm theo cách tương tự như trong ví dụ thứ hai. P.S. 'lớp Test' nên yêu cầu 16MB bộ nhớ, 4 triệu * 4 byte mỗi int. –

+0

Việc tạo mã không được tối ưu hóa một cách không hợp lý và sau đó tối ưu hóa nó là không hợp lý. Mặc dù, rõ ràng, đó mang lại kết quả tối ưu đáng kể trong trường hợp này. –

Trả lời

-2

Đây chắc chắn là lỗi. Tôi có thể tái tạo điều này với 5.3 trên hệ thống của tôi. Việc sử dụng RAM tăng lên nhanh chóng, nhưng tôi đã đóng chương trình vì tôi không muốn hệ thống của mình bị lỗi. Mặt khác, nếu tôi biên dịch nó trong Clang 3.8, nó biên dịch gần như ngay lập tức.

Tôi khuyên bạn nên báo cáo điều này với gcc.gnu.org/bugzilla. Như indicated here hãy xem các báo cáo lỗi 59659, 68203 và 56671. Tôi khá chắc chắn rằng tất cả chúng đều trỏ đến cùng một vấn đề về tính không có khả năng của GCC để có một mảng lớn loại không tầm thường.

+1

"Đây chắc chắn là một lỗi". Bằng chứng? –

+0

Ngoài ra, bạn về cơ bản đã sao chép câu trả lời từ câu hỏi [this] (http://stackoverflow.com/questions/37260097/stdarray-with-aggregate-initialization-on-g-generates-huge-code). Vui lòng cung cấp tín dụng khi tín dụng đến hạn. –

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