Hãy xem xét đoạn trích sau:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Rõ ràng là nó sẽ sập trên hầu hết các nền tảng, vì kích thước ngăn xếp mặc định thường nhỏ hơn 20MB.
Bây giờ hãy xem xét các mã sau đây:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Đáng ngạc nhiên là nó cũng gặp sự cố! Truy nguyên (với một trong các phiên bản libstdc ++ gần đây) dẫn đến include/bits/stl_uninitialized.h
tệp, nơi chúng ta có thể thấy các dòng sau:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Hàm vector
xây dựng thay đổi kích thước phải khởi tạo mặc định các phần tử và đây là cách nó được triển khai. Rõ ràng, _ValueType()
tạm thời sụp đổ các ngăn xếp.
Câu hỏi là liệu đó có phải là một triển khai phù hợp. Nếu có, điều đó thực sự có nghĩa là việc sử dụng một loại vectơ khổng lồ khá hạn chế, phải không?
std::allocator
được sử dụng.