2015-07-30 17 views
8

Tôi muốn tìm một cách để lưu trữ một số std::vectors, mỗi kích thước khác nhau nhưng được biết đến và hợp lý nhỏ, trong bộ nhớ liền kề. Tôi nhận ra rằng tôi có thể viết lớp của riêng mình, nói với một mảng rất lớn và với con trỏ đến đầu mỗi phần con của mảng trong mảng lớn hơn được xử lý như một thực thể riêng biệt, nhưng có vẻ như phải có cách thông minh hơn để làm điều này .Phân bổ bộ nhớ tiếp giáp cho một số std :: vectơ nhỏ?

Có cách nào để sử dụng allocators, ví dụ: để tạo tiếp giáp std::vectors? Tôi không muốn phát minh lại bánh xe chỉ vì tôi muốn địa phương bộ nhớ này khác bình thường std::vectors

Tôi không biết cách bắt đầu viết mã. Tôi cần phải tạo ra một cấp phát có một con trỏ vào bộ nhớ, phân bổ một vector ở đó, và sau đó bằng cách nào đó trả lại địa chỉ của phần cuối của vectơ đó, vì vậy bộ cấp phát tiếp theo của std::vector có thể lấy nó và làm lại. Làm cách nào để một giá trị trả lại có thể là allocator?

+2

Có, bạn có thể sử dụng trình phân bổ để thực hiện việc này. Bạn đã thử cái gì? Hiển thị công việc của bạn :) – Andrew

+0

@Andrew Tôi đã thêm một cái gì đó trong câu hỏi của tôi, nhưng tôi không biết bắt đầu từ đâu. Tôi đã không làm việc với phân bổ, và cho đến nay tất cả tôi đã làm là đọc phần của Josuttis trong tài liệu tham khảo STL của mình. – sunny

+1

Bất kỳ cơ hội nào, có kích thước được biết đến lúc biên dịch không? – dasblinkenlight

Trả lời

1

Giải pháp là @ HowardHinnant's short_alloc. Tôi muốn phân bổ trên heap vì vậy phải sử dụng new, *** nhưng nếu không mã của Howard đã thực hiện chính xác những gì tôi muốn.

template <std::size_t N> 
class arena 
{... 
char* buf_ = new char[N] 
// still need to align this but not sure of the syntax 
// to do that with a new statement 
... 

Các mảnh mất tích từ góc nhìn của tôi khi tôi hỏi những câu hỏi là allocators thể có constructors rằng một vài tham số:

constexpr int N = 1000*sizeof(int); 
arena<N> myArena; 
std::vector<int, short_alloc<int, N>> x(MyArena); 

Tôi tìm thấy tài liệu tham khảo mã trong một SO bài: Questions about Hinnant's stack allocator được tham chiếu từ bài viết của CodeReview mà Chris Drew đã đề xuất trong bình luận của anh ở trên. Cảm ơn tất cả.

*** Mã này không sử dụng new trong phương pháp allocate, để lại tôi không chắc chắn về việc liệu này được cấp phát trên stack (như nó xuất hiện từ việc kê khai của buf_ *) hoặc trên heap (sử dụng new) ...

0

Đối với yêu cầu của bạn, tôi sẽ triển khai cấp phát tùy chỉnh mở rộng std :: allocator và ghi đè phân bổ, phương thức deallocate lấy khối từ một nhóm bộ nhớ. Nếu bạn đã biết kích thước tối đa cần thiết, việc chọn kích thước vùng bộ nhớ không phải là vấn đề.

+0

Có, tôi đồng ý, đó là chiến lược tôi đã nêu trong câu hỏi ban đầu của mình, nhưng tôi không rõ ràng về cách thực hiện nó với một người cấp phát. Giải pháp tôi đăng bên dưới thực hiện những gì tôi muốn. – sunny

+0

Nếu bạn muốn phân bổ trên ngăn xếp, có một cái nhìn tại grabbing bộ nhớ với builtoca alloca. Tùy chỉnh của bạn cấp phát có sự lựa chọn nơi để lấy hồ bơi bộ nhớ từ. Hy vọng nó giúp. Vì điều này được phân bổ trên ngăn xếp, nó sẽ tự động bị hủy khi trả lại. – kchoi

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