Tôi hơi bối rối bởi ngữ nghĩa heap và by-value-versus-by-reference liên quan đến việc đặt một khóa std::string
và giá trị struct
lớn vào một vùng chứa như boost::interprocess::map
.Làm cách nào tôi có thể trả về một xử lý mờ (void * hoặc dword) có thể được đưa trở lại thành phần tử giá trị được lưu trữ trong bản đồ tăng tốc :: interprocess?
Đây là hoàn cảnh của tôi, và một số typedefs Tôi đang sử dụng:
typedef std::string AreaKeyType;
typedef DATA_AREA_DESC AreaMappedType; // DATA_AREA_DESC is a big struct.
typedef std::pair<const AreaKeyType, AreaMappedType> AreaValueType;
typedef boost::interprocess::allocator<AreaValueType, boost::interprocess::managed_shared_memory::segment_manager> AreaShmemAllocator;
typedef boost::interprocess::map<AreaKeyType, AreaMappedType, std::less<AreaKeyType>, AreaShmemAllocator> AreaMap;
Sau đây là cách tôi chèn AreaValueType (mà là một typedef cho std :: cặp):
AreaValueType A(areaKey, arearec);
anAreaMap->insert(A);
Tôi tin rằng các bản sao mã ở trên A là một cặp std :: trên ngăn nhớ cục bộ (không chia sẻ bộ nhớ) của tôi vào một vùng bộ nhớ dùng chung. Tôi có thể có được một xử lý cho rằng khu vực bộ nhớ chia sẻ bên trong tăng :: interprocess :: bản đồ hoặc tôi giới hạn để lấy lại hồ sơ đó trở lại toàn bộ và lưu trữ toàn bộ? (Nói cách khác, tôi có thể lưu trữ thứ gì đó như cấu trúc thành bản đồ interprocess tăng cường và sau đó cập nhật một byte đơn bên trong bản ghi đó hoặc tôi chỉ phải cập nhật toàn bộ bản ghi bằng cách thay thế tất cả các byte trong cấu trúc DATA_AREA_DESC, với byte)
một số tiếp tục làm rõ.
tôi có một tuổi ANSI C DLL api xuất khẩu rõ ràng rằng trong nội bộ sử dụng C++ và Boost :: interprocess :: bản đồ. Hàm này được mong đợi để tạo một mục trong bản đồ và sau đó trả về một tay cầm. Làm thế nào tôi có thể chèn một cái gì đó vào tăng :: interprocess :: bản đồ và sau đó trả về một xử lý cho thực thể đó, cho người dùng không phải C++, tốt nhất là cast
void*
hoặcunsigned long
? Tất cả những gì tôi có thể làm là lấy nội dung từ bộ nhớ dùng chung bằng cách tra cứu giá trị std :: string key và ghi một bản ghi mới vào bộ nhớ. Thay vào đó, tôi muốn có thể giữ một tham chiếu đến đối tượng bộ nhớ dùng chung xung quanh.Nếu tôi không thể trực tiếp làm điều đó, tôi sẽ làm điều đó gián tiếp như thế nào? Tôi cho rằng tôi có thể giữ một std không chia sẻ bộ nhớ :: vector, và phân bổ một bộ nhớ không chia sẻ std :: string giữ giá trị của areaKey, đó là một std :: string, và sau đó làm một diễn viên của
void*
quay trở lạistd::string
và sau đó sử dụng nó để tìm nạp bản ghi ra khỏi vùng bộ nhớ dùng chung. Điều đó dường như có nhiều công việc hơn là cần thiết cho một thứ gì đó sơ cấp. Có thể tăng :: interprocess :: map không phải là lựa chọn đúng cho các yêu cầu của tôi?
Tôi đã thử gì? Điều này, mà biên dịch, nhưng tôi không có ý tưởng nếu tôi làm điều này đúng. Bằng cách nào đó tôi cảm thấy xấu xí bên dereferencing một ::iterator
trở về từ find
, và sau đó ngay lập tức lấy địa chỉ của nó như sau:
void ** handle; // actually a parameter in my api.
*handle = (void*)&(*anAreaMap->find(areaKey));
Cập nhật Các công trình trên. Tuy nhiên, lời khuyên rất hợp lý trong câu trả lời dưới đây KHÔNG làm việc. Sử dụng tăng :: interprocess :: chuỗi kết quả trong hoàn thành và tổng số thất bại và treo trong thời gian chạy. Sử dụng std :: string, mà không có quyền làm việc trừ khi các tác giả của Boost mã std :: string hỗ trợ đặc biệt, thực sự hoạt động tốt.
tốt, bạn có thể sử dụng tại() thay vì tìm(), sau đó sẽ không có dereferencing :) – EHuhtala
Tôi nghĩ rằng bạn là đúng. –