2010-04-07 34 views
7

Đây là một câu hỏi đáng xấu hổ, nhưng ngay cả tài liệu được viết tốt được cung cấp với boost.interprocess chưa đủ để tôi tìm ra cách để làm điều này.C++ phân bổ, đặc biệt là vượt qua các đối số constructor cho các đối tượng được phân bổ với boost :: interprocess :: cached_adaptive_pool

gì tôi có là một ví dụ cached_adaptive_pool cấp phát, và tôi muốn sử dụng nó để xây dựng một đối tượng, đi dọc theo thông số nhà xây dựng:

struct Test { 
    Test(float argument, bool flag); 
    Test(); 
}; 

// Normal construction 
Test obj(10, true); 
// Normal dynamic allocation 
Test* obj2 = new Test(20, false); 

typedef managed_unique_ptr< 
    Test, boost::interprocess::managed_shared_memory>::type unique_ptr; 

// Dynamic allocation where allocator_instance == cached_adaptive_pool, 
// using the default constructor 
unique_ptr obj3 = allocator_instance.allocate_one() 
// As above, but with the non-default constructor 
unique_ptr obj4 = allocator_instance ... ??? 

này rất tốt có thể là một thất bại trên một phần của tôi về cách sử dụng các đối tượng cấp phát nói chung. Nhưng trong mọi trường hợp, tôi không thể xem cách sử dụng trình phân bổ cụ thể này, với giao diện được chỉ định trong cached_adaptive_pool để truyền các đối số hàm tạo cho đối tượng của tôi.

cached_adaptive_pool có phương pháp: void construct(const pointer & ptr, const_reference v) nhưng tôi không hiểu điều đó có nghĩa là gì và tôi không thể tìm thấy ví dụ sử dụng nó.

Đầu của tôi đã được bơi trong các mẫu cả ngày, do đó, một bàn tay giúp đỡ, ngay cả khi câu trả lời là hiển nhiên, sẽ được đánh giá cao.

Trả lời

1

cached_adaptive_pool có phương pháp: trống xây dựng (const pointer & ptr, const_reference v) nhưng tôi không hiểu những gì phương tiện đó và tôi không có thể tìm thấy ví dụ sử dụng nó.

Nó nên làm theo giao diện của std::allocator, trong trường hợp này allocate() cung cấp cho bạn một đoạn phù hợp bộ nhớ chưa được khởi tạo và construct() cuộc gọi vị trí mới trên con trỏ nhất định.

Cái gì như:

allocator_instance.construct(allocator_instance.allocate_one(), Test(30, true)); 

đã không được sử dụng những hồ bản thân mình, mặc dù. Trong C++ 0x, các trình phân bổ sẽ có thể gọi bất kỳ hàm tạo nào, không chỉ là trình tạo bản sao, vì vậy có thể các trình phân bổ của boost đã hỗ trợ điều này đến mức nào đó.

a.construct(p, 30, true); //a C++0x allocator would allow this and call new (p) Test(30, true) 
+0

Cảm ơn. Hình thức đầu tiên là loại câu trả lời tôi mong đợi, nhưng đã quá bối rối và mệt mỏi để nhận ra bản thân mình. Dạng thứ hai 'a.construct (p, 30, true)' dường như không được hỗ trợ bởi bộ cấp phát tăng cường cụ thể này. Khá khó chịu, vì 'cached_adaptive_pool.construct()' trả về 'void', tôi phải viết' allocator_t :: pointer obj = allocator.allocate_one(); allocator.construct (obj, Test (30, true)) '? Tôi không chắc chắn những gì tồi tệ hơn, bằng cách sử dụng hai báo cáo cho một hoạt động đơn giản hoặc sử dụng một vị trí hơi lạ tìm kiếm mới trực tiếp. – porgarmingduod

+0

Bạn có thể làm cho một chức năng riêng biệt. – UncleBens

1

Tôi đoán tôi luôn có thể sử dụng cú pháp vị trí mới. Ý tưởng là để dereference con trỏ thông minh (trong trường hợp này offset_ptr) trả về bởi cấp phát, và sau đó chuyển địa chỉ thô sang new().

unique_ptr obj = new(&(*allocator_instance.allocate_one())) Test(1,true) 

Đây có phải là cách thành ngữ để thực hiện việc này không? Có rất nhiều nơi khác trong việc thúc đẩy hỗ trợ rõ ràng được cung cấp để tránh sử dụng vị trí mới, điều đó làm cho tôi nghĩ là không. Trong mọi trường hợp, tôi sẽ chấp nhận câu trả lời này nếu không có gì tốt hơn được cung cấp trong tương lai gần.

+0

Trình tự '& * ptr' là gì? – UncleBens

+0

Khi tôi thử nghiệm nó, mới sẽ chỉ chấp nhận một con trỏ thô, không phải là một offset_ptr mà các cấp phát trả về. – porgarmingduod

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