C++ 如何从boost共享内存向量中获取一个字符串,该向量w/o触发从所检索字符串的构造函数中分配共享内存?

C++ 如何从boost共享内存向量中获取一个字符串,该向量w/o触发从所检索字符串的构造函数中分配共享内存?,c++,memory-management,boost,shared-memory,C++,Memory Management,Boost,Shared Memory,考虑到这些类型(来自,或多或少): 通过声明ShmString,我向自己证明了记忆被占用了 std::string size 170, before ins: 999232, after ins: 998976, shared memory taken by ins: 256 after get: 998768, shared memory taken by get: 208 使用引用 ShmString &res1 =

考虑到这些类型(来自,或多或少):

通过声明
ShmString
,我向自己证明了记忆被占用了

std::string size 170,     
before ins:    999232, after ins: 998976, shared memory taken by ins: 256 
                       after get: 998768, shared memory taken by get: 208
使用引用

ShmString &res1 = vec2->at(0);

请记住,这实际上不是复制字符串,而是引用原始字符串。这将完全足以阅读它的内容(在其中,您应该声明
res1
const

正如Wug提到的,您可以使用一个引用

ShmString &res1 = vec2->at(0);
在字符串类型之间转换/分配: 如果确实需要在共享内存之外复制,请复制到常规(或其他分配器)字符串:

当然,同样的方法也适用,反之亦然:

vec2[0].assign(copied.begin(), copied.end());
// Or
vec2->emplace_back({copied.begin(), copied.end()});
等等

直接在共享内存上使用流 还请注意,Boost进程间存在以下问题:

typedef allocator<int, managed_shared_memory::segment_manager>
   IntAllocator;
typedef allocator<char, managed_shared_memory::segment_manager>
   CharAllocator;
typedef vector<int, IntAllocator>   MyVector;
typedef basic_string
   <char, std::char_traits<char>, CharAllocator>   MyString;
typedef basic_vectorstream<MyString>               MyStringStream;
并将其读回,将其直接复制到另一个共享内存字符串中:

  //Auxiliary vector to compare original data
   MyVector *myvector2 =
      segment.construct<MyVector>("MyVector2")
      (IntAllocator(segment.get_segment_manager()));

   //Avoid reallocations
   myvector2->reserve(100);

   //Extract all values from the internal
   //string directly to a shared memory vector.
   std::istream_iterator<int> it(mystringstream), itend;
   std::copy(it, itend, std::back_inserter(*myvector2));

   //Compare vectors
   assert(std::equal(myvector->begin(), myvector->end(), myvector2->begin()));
//用于比较原始数据的辅助向量
MyVector*myvector2=
段.构造(“MyVector2”)
(IntAllocator(segment.get_segment_manager());
//避免再分配
myvector2->reserve(100);
//从内部文件中提取所有值
//字符串直接指向共享内存向量。
std::istream_迭代器it(mystringstream),itend;
std::copy(it、itend、std::back_inserter(*myvector2));
//比较向量
断言(std::equal(myvector->begin(),myvector->end(),myvector2->begin());

这是从文档示例中获取的,您可以看到它[Live On Coliru](

感谢您提供的详细答案。将内容推送到向量中时,您有什么建议?我还注意到,在堆栈上声明ShmString会占用共享内存,vec->push_back(str);使复制构造函数绊倒会花费更多的时间。boost::move是否合适?您可以使用emplace(演示:),也可以参见示例。当然,这可以作为单独的问题发布
typedef allocator<int, managed_shared_memory::segment_manager>
   IntAllocator;
typedef allocator<char, managed_shared_memory::segment_manager>
   CharAllocator;
typedef vector<int, IntAllocator>   MyVector;
typedef basic_string
   <char, std::char_traits<char>, CharAllocator>   MyString;
typedef basic_vectorstream<MyString>               MyStringStream;
   //Create the stream. To create the internal shared memory
   //basic_string we need to pass the shared memory allocator as
   //a constructor argument
   MyStringStream mystringstream(CharAllocator(segment.get_segment_manager()));

   //Reserve the internal string
   mystringstream.reserve(100*5);

   //Write all vector elements as text in the internal string
   //Data will be directly written in shared memory, because
   //internal string's allocator is a shared memory allocator
   for(std::size_t i = 0, max = myvector->size(); i < max; ++i){
      mystringstream << (*myvector)[i] << std::endl;
   }
  //Auxiliary vector to compare original data
   MyVector *myvector2 =
      segment.construct<MyVector>("MyVector2")
      (IntAllocator(segment.get_segment_manager()));

   //Avoid reallocations
   myvector2->reserve(100);

   //Extract all values from the internal
   //string directly to a shared memory vector.
   std::istream_iterator<int> it(mystringstream), itend;
   std::copy(it, itend, std::back_inserter(*myvector2));

   //Compare vectors
   assert(std::equal(myvector->begin(), myvector->end(), myvector2->begin()));