在没有共享内存的情况下提升进程间字符串
Posted
技术标签:
【中文标题】在没有共享内存的情况下提升进程间字符串【英文标题】:Boost interprocess string without shared memory 【发布时间】:2013-10-16 08:56:27 【问题描述】:所以,这个问题与前一个问题相关联(std::string
没有从char*
复制)。
现在我遇到了boost:interprocess::string
,它允许在共享内存 地址空间内构造字符串。由于我已经获得了 char*
内存,我想知道是否可以重用 boost:interprocess::string
以避免复制。
但是,我正在阅读的每个文档都使用 boost::interprocess::managed_shared_memory
及其兄弟。
有没有人使用提升管理字符串没有共享内存?怎么样?
谢谢!
【问题讨论】:
【参考方案1】:简短回答:不。
更长的答案:您必须了解您的 std::string
实现。例如 LLVM 的 libcxx 参见 here。您可以在其中获取您的 char*
,但它可能涉及丑陋的 hack,您必须针对任何 STL 实现调整您的代码。
【讨论】:
【参考方案2】:问题是你的 char * 指向你的进程的内存(堆),当进程不再运行这个内存是无效的。共享内存在进程之间共享。 您必须从 char * 复制到共享内存段中,在我看来这是唯一的选择。请告诉我您的 char * 指向堆上的哪个位置?
但是从共享内存或内存映射文件中读取可以在不复制的情况下完成,您可以使用像 string_view 这样的容器 boost::string_ref 或 boost::string_view 或 C++17 std::字符串视图include <experimental/string_view>
。这些是没有所有权的容器,允许您通过 char * , size
引用内存,但是由于共享内存是共享的,因此很难想象它是否可以成为生产质量代码,因为任何进程都可以更改您的内存,除非您从不写但是仅从 SHM 读取。
在我看来,答案是否定的。不过我会等待更有经验的开发者。
【讨论】:
以上是关于在没有共享内存的情况下提升进程间字符串的主要内容,如果未能解决你的问题,请参考以下文章