2016-09-17 22 views
16

Có phải std::array<int,10> (không có bản thân mình sử dụng new) đảm bảo được cấp phát trong ngăn xếp thay vì sau đó là đống bằng C++ - Tiêu chuẩn?Không std :: array <> đảm bảo phân bổ trên ngăn xếp chỉ?

Để rõ ràng, tôi không có nghĩa là new std::array<int, 10>. Tôi chủ yếu tự hỏi, nếu thư viện chuẩn được phép sử dụng new bên trong việc thực hiện nó.

Trả lời

11

tôi không thể tìm thấy câu trả lời rõ ràng hơn trong tiêu chuẩn, nhưng [array.overview]/2:

Một mảng là một tổng hợp ([dcl.init.aggr]) có thể là danh sách khởi tạo lên đến N yếu tố có loại là chuyển đổi thành T.

[dcl.init.aggr]/1:

Một tổng hợp là một mảng hoặc một lớp (khoản [class]) với

  • không dùng cung cấp, rõ ràng, hoặc được thừa kế nhà thầu ([class.ctor]),

...

Đó về bao gồm nó. Không có cách nào một tổng thể có thể phân bổ bộ nhớ động (hoặc có lẽ, làm bất cứ điều gì ở tất cả của riêng mình trong quá trình xây dựng). Chỉ có một nhà xây dựng tầm thường được khai báo ngầm.

Tất nhiên, nếu bạn new std::array<...>, bạn sẽ nhận được một mảng trên "vùng heap".


Một số có thể hài lòng hơn bởi những gì chúng ta có thể nhận được trên cppreference:

std::array là một container mà gói gọn mảng kích thước cố định.

Vùng chứa này là loại tổng hợp có cùng ngữ nghĩa như cấu trúc chứa mảng kiểu C T[N] làm thành viên dữ liệu không tĩnh duy nhất của nó.


Thứ ba, std::array đã được giới thiệu trong C++ 11. Tại sao? Ví dụ: để bổ sung std::vector theo một số cách, chẳng hạn như sử dụng ở các chức năng constexpr, trong đó không cho phép phân bổ động.

+2

+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

+4

@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

+0

@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

11

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

Bạn có thể chỉ cho tôi cách triển khai stackless thú vị đó không? Âm thanh thú vị khủng khiếp. (Những điều này không bao giờ TL; DR ...) – towi

+0

@towi xin lỗi, tôi biết nó tồn tại, đó là tất cả. – Yakk

+3

@towi [IBM mainframes, apparently.] (Http://stackoverflow.com/questions/10900885/are-there-stackless-or-heapless-implementation-of-c) Chi tiết hơn một chút trong các bình luận về câu trả lời của Jerry Coffin đó. – hvd

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