2009-10-29 31 views
17

Nếu std :: vector và bạn bè đang tự thay đổi kích thước, điều đó có nghĩa là nếu tôi khai báo một vector như vậy:STL container trên stack và heap

std::vector<string> myvec; 

Sau đó, nó sẽ chỉnh kích cỡ sử dụng ngăn xếp hơn, trong khi :

std::vector<string> *myvec = new std::vector<string>(); 

Sẽ thay đổi kích thước bằng nhiều vùng heap hơn?

+2

Bạn cũng có thể triển khai vectơ 'cố định kích thước' để lưu trữ tất cả điều này trên ngăn xếp. Nó hoạt động khá tốt và có thể là một tối ưu hóa. Tuy nhiên, chi phí là nó sẽ không phải là vô hạn mở rộng> bạn sẽ phải giải quyết cho một giới hạn cao, và nó sẽ luôn luôn tiêu thụ nhiều không gian. –

+0

Điều đó thật thú vị, do đó, vectơ "kích thước cố định" hoàn toàn nằm trên ngăn xếp? – Benj

+1

Tôi không biết một vector có kích thước cố định, nhưng nếu bạn muốn dữ liệu cố định của mình trên ngăn xếp, hãy xem xét sử dụng std :: tr1 :: array, có vẻ tương tự. – stefaanv

Trả lời

24

Vectơ phân bổ trên heap trong nội bộ của chúng.

Điều duy nhất bạn trả tiền trong ngăn xếp cho một ngăn xếp dựa trên stack là một vài byte, bộ đệm bên trong sẽ luôn được cấp phát từ vùng heap.

Vì vậy, hiệu quả khi bạn thực hiện vec = new vector() bạn đang phân bổ một số lượng nhỏ, điều này có thể không thực sự tốt.

+0

Ah ok, do đó, các vectơ được khai báo trên ngăn xếp có xóa bộ nhớ mà chúng đã sử dụng sau khi chúng ra khỏi phạm vi không? – Benj

+0

@Benj: Có, họ sẽ dọn dẹp bộ nhớ khi họ đi ra khỏi phạm vi. – Naveen

+6

@Benj: lưu ý rằng vectơ chỉ dọn dẹp bộ nhớ mà chúng đã phân bổ. Nếu bạn thêm các đối tượng được phân bổ heap (với 'mới') vào một vectơ, thì bạn có trách nhiệm gọi 'xóa' trên chúng. Có lẽ bạn đã biết điều này, nhưng tôi muốn đề cập đến nó chỉ trong trường hợp ... – StackedCrooked

1

std :: vector luôn có bộ đệm được cấp phát trên heap. Vì vậy, bất kể nơi mà chính vector được phân bổ thay đổi kích cỡ, nó sẽ chỉ ảnh hưởng đến heap.

8

Trong trường hợp đầu tiên, bạn đang tạo vectơ trên ngăn xếp. Điều đó không có nghĩa là tất cả các đối tượng bên trong của vectơ đều nằm trên stack. Trong thực tế, vectơ vẫn sẽ cấp phát bộ nhớ cần thiết để chỉ giữ các đối tượng trên heap. Điều này là do, để phân bổ trên stack, bạn nên biết có bao nhiêu đối tượng để tạo ra. Nhưng thông tin này không có sẵn, do đó, chỉ còn lại tùy chọn là cấp phát bộ nhớ cho đối tượng chứa từ heap.

+0

Nó cũng cần lưu ý rằng nó phổ biến cho std :: string để giữ một số nội bộ của nó "đối tượng" trên ngăn xếp. Trên thực tế, là std :: vector bị cấm làm điều đó? –

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