Một thắc mắc nhỏ về memory khi dùng containers trong C++

Hi mọi người.
Mình có một thắc mắc sau mà khi đi thi CP hay gặp nhưng ko biết xử lý sao, nhờ mọi người giải đáp ạ:
Kích thước tối đa của vector (với int, char, long long, double …) có thể khai báo và sử dụng?
Mình có dùng .max_size() để xem maximal size của vector<int> thì ra là 1073741823 ~ 10^9 nhưng khi khai báo vector<int> v(1e9, 0) rồi cout thì bị bad_alloc.
Tham khảo trên CPlusPlus mình có thấy 1 đoạn sau: " but the container is by no means guaranteed to be able to reach that size: it can still fail to allocate storage at any point before that size is reached. "
Nếu vậy thì chính xác max size mà vector có thể reach là bao nhiêu hay ko có giá trị cụ thể ạ?
Và mình cũng đặt câu hỏi tương tự cho vector<char>vector<long long> luôn !

Thi CP thì thường đặt mảng đến 2e7 là căng rồi nhé. Đề không bao giờ cho N lớn hơn mức đó đâu. Nếu có thì tức là đề không cho dùng mảng nữa.

1 Like

Tùy vào các chương trình đang chạy (kể cả HĐH), chắc khoảng 1GB (tầm 250m - 300m slot) là kịch kim vì vùng nhớ (thực ra toàn là địa chỉ) phải liên tục. (x86 thôi nhé)

3 Likes

Hi Long Dragon.
Theo mình thì vector trong C++ thực tế chỉ là một lớp vỏ bọc của cấp phát động (Bổ sung thêm các chức năng thay đổi kích thước linh hoạt). Vậy nên kích thước tối đa của nó sẽ tương tự nhu việc bạn có thể cấp phát động tối đa được bao nhiêu. Khi bạn tạo size 10^9 kiểu int thì cấp phát vào cỡ 3,7GB một lúc trên các máy tính thông rất dễ gặp lỗi.
Tất nhiên vẫn có những chương trình có thể dùng hàng trăm GB ram được. Nhưng nó không cấp phát cùng một lúc hoặc trên các phần cứng tốt.

2 Likes

Mình cảm ơn nhiều nhé!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?