2012-02-07 19 views
16

Liên quan đến rất nhiều câu hỏi và câu trả lời trên SO, tôi đã học được rằng nó tốt hơn để tham khảo các đối tượng mà cuộc đời của họ được quản lý như cư trú trong lưu trữ tự động chứ không phải là ngăn xếp.Tại sao các thuật ngữ "tự động" và "động" được ưu tiên hơn các cụm từ "ngăn xếp" và "đống" trong quản lý bộ nhớ C++?

Ngoài ra, các đối tượng được phân bổ động không nên được gọi là cư trú trên heap, nhưng trong bộ nhớ động.

Tôi nhận được rằng có bộ nhớ tự động, động và tĩnh, nhưng không bao giờ thực sự hiểu sự khác biệt giữa tự động ngăn xếp và vùng heap động. Tại sao lại được ưu tiên?

Tôi không hỏi ý nghĩa của stack/heap hoặc cách hoạt động của quản lý bộ nhớ. Tôi hỏi lý do tại sao các điều khoản lưu trữ tự động/động được ưu tiên hơn các cụm từ stack/heap.

+0

Tôi thực hiện những điều sau đây không trả lời câu hỏi của bạn? http://stackoverflow.com/questions/408670/stack-static-and-heap-in-c – NPE

+1

@aix nó không. Hoặc ít nhất nó không nói cách một thuật ngữ được ưa thích hơn khác, hoặc sự khác biệt. –

+0

có thể trùng lặp của [Sử dụng chồng và đống đúng cách trong C++?] (Http://stackoverflow.com/questions/599308/proper-stack-and-heap-usage-in-c) – NPE

Trả lời

22

Automatic nói với tôi điều gì đó về cuộc đời của một đối tượng: đặc biệt là nó được ràng buộc tự động với phạm vi bao quanh, và sẽ bị phá hủy tự động khi mà lối ra phạm vi.

Động cho tôi biết rằng tuổi thọ của đối tượng không được kiểm soát tự động bởi trình biên dịch, nhưng dưới sự kiểm soát trực tiếp của tôi.

Ngăn xếp là tên quá tải cho loại vùng chứa và giao thức con trỏ phổ biến có liên quan được hỗ trợ theo hướng dẫn chung callret. Nó không cho tôi biết bất cứ điều gì về tuổi thọ của một đối tượng, ngoại trừ thông qua một liên kết lịch sử để đối tượng thời gian sống trong C, do các quy ước khung phổ biến. Cũng lưu ý rằng trong một số triển khai, lưu trữ cục bộ địa chỉ là trên ngăn xếp của một chuỗi nhưng không giới hạn phạm vi của bất kỳ chức năng đơn lẻ nào.

Heap lại là tên bị quá tải, biểu thị loại chứa được sắp xếp hoặc hệ thống quản lý cửa hàng miễn phí. Đây là không chỉ là cửa hàng miễn phí có sẵn trên tất cả các hệ thống và cũng không cho tôi biết bất kỳ điều gì cụ thể về tuổi thọ của đối tượng được phân bổ với new.

+0

Cũng cần biết: Không phải tất cả các hệ thống đều sử dụng "ngăn xếp" cho các chức năng không đệ quy. Ngoài ra: Có thể tạo các đối tượng động trên "stack" (tôi nghĩ 'boost :: variant does' this). –

4

Điều khoản lưu trữ tự động/động là thích hợp hơn vì đây là tiêu chuẩn yêu cầu. Stack/heap được thực hiện dựa trên và về mặt lý thuyết có thể được thực hiện theo cách khác.

6

Hầu hết các triển khai sử dụng ngăn xếp để quay lại các đối tượng có bộ nhớ tự động. Đây không phải là yêu cầu của tiêu chuẩn, nhưng nó hoạt động tốt trên hầu hết các kiến ​​trúc CPU trong những ngày này.

Triển khai sử dụng các chiến lược khác nhau để quay lại các đối tượng có thời lượng lưu trữ động. Tôi không chắc chắn một heap là cách tốt nhất để mô tả những gì hiện đại bộ nhớ cấp phát sử dụng, nhưng đó dường như là "lịch sử" hạn cho điều đó.

Vì vậy, lưu trữ tự động/động là các thuật ngữ sử dụng tiêu chuẩn để phân loại thời gian tồn tại của đối tượng ("trừu tượng"). Đó là những điều khoản thích hợp để sử dụng nếu bạn muốn nói các đối tượng như tiêu chuẩn mô tả chúng.
Ngăn xếp và đống là các kỹ thuật triển khai ("cụ thể") có thể được sử dụng để trả lại chúng. Sử dụng những thuật ngữ này là ít chính xác hơn, trừ khi bạn đang nói về một triển khai cụ thể.

3

Phân bổ chồng/đống kỹ thuật nói là chi tiết triển khai, trong khi lưu trữ tự động/động là các thuật ngữ chung chung hơn. Bản thân tiêu chuẩn không ủy quyền rằng người cấp phát phải sử dụng một chồng/đống. Do đó, tự động/động là thuật ngữ thích hợp hơn, mặc dù cá nhân tôi thấy rằng sự khác biệt là hơi quá mức.

1

Stack và Heap mang lại khái niệm liên quan đến việc thực hiện thành hình ảnh, trong khi các điều khoản "tự động" và "năng động" là tổng quát hơn

3

Các thuật ngữ "thời gian tĩnh lưu trữ", "thời gian lưu trữ tự động", và "năng động thời gian lưu trữ "xuất hiện trong tiêu chuẩn C++.

Thuật ngữ "ngăn xếp" và "đống" được sử dụng để tham chiếu đến các đối tượng địa lý trong Thư viện chuẩn (stack<>, make_heap(), push_heap(), v.v.).

+0

Xin lỗi vì đã trả lời câu trả lời trước của bạn, tôi nhận ra câu hỏi không rõ ràng. +1 –

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