C++ không có khái niệm về chồng hoặc đống. Đó là những chi tiết thực hiện, và có ít nhất một nền tảng không sử dụng một ngăn xếp truyền thống (nhưng thay vào đó là danh sách liên kết phân bổ heap cho nó).
Nó có bộ nhớ tự động và cửa hàng miễn phí. new
truy cập cửa hàng miễn phí và các biến "trên ngăn xếp" được chuyển vào bộ nhớ tự động.
Trong thực tế, để phân bổ mọi thứ trên cửa hàng miễn phí, bạn phải mạo hiểm ngoại lệ bộ nhớ. Vì vậy, quy tắc chung là những thứ đảm bảo họ không ném phải sử dụng bộ nhớ tự động. array
đảm bảo sự bảo đảm này (ngoại trừ bất cứ điều gì trong đó có thể ném, tự nhiên). Đây cũng là một tổng hợp của dữ liệu cũ đơn giản, hiệu quả buộc phải trông giống như:
template<class T,std::size_t N>
struct array {
T __no_fixed_name__[N];
// non-constructor/destructor methods omitted as they are noise at this point
};
Về lý thuyết nó có thể được thực hiện bởi trình biên dịch thông qua kỳ diệu mà không phải là thực tế C++, nhưng không có nhu cầu cho điều đó, vì vậy không ai phiền.
TL; DR: vâng, nó ở trên ngăn xếp.
+1 Nói cách khác, bạn nhận được sự đảm bảo giống như 'mẫu struct array {T elems [N]; }; 'w.r.t. layout ('elems' không tồn tại). –
GManNickG
@towi: Lưu ý rằng C++ không thực sự có khái niệm về chồng hoặc đống. Thông thường chúng tôi hiểu ý bạn là gì, nhưng bạn đã hỏi "theo tiêu chuẩn C++". Bạn nhận được sự bảo đảm giống như ví dụ tôi đã nêu ở trên; cách phân bổ này tùy thuộc vào việc triển khai của bạn. (Về lý thuyết tôi có thể viết một trình biên dịch câm mà không sử dụng ngăn xếp ở tất cả, và tự động phân bổ tất cả mọi thứ.) – GManNickG
@GManNickG Bạn biết đấy, tôi hoàn toàn bỏ lỡ điều đó! "không có khái niệm về ngăn xếp và đống", thực sự? Cũng không có phân bổ "động" hoặc "tĩnh"? Bạn có thể đúng, tìm kiếm nhanh trong Std đồng ý với điều đó. Tôi đoán định nghĩa nếu 'new' và spec của' 'mô tả phân bổ động cụ thể làm cho tôi bỏ lỡ sự vắng mặt của một đặc tả phân bổ tĩnh. Với trình biên dịch câm của bạn, tôi tự hỏi nếu có thể có thể làm mọi thứ trên stack. Không có lẽ không, làm thế nào tôi có thể hỗ trợ 'mới'? Nhưng đó là một câu hỏi khác. –
towi