在共享内存中共享std :: string

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在共享内存中共享std :: string相关的知识,希望对你有一定的参考价值。

我希望使用共享内存在进程间共享std::string。但是,我担心字符串对象在堆栈或堆上的分配位置,因为这会影响共享。

参考这个,MSDN Forum

...它说 :

请注意,在新的STL(Visual Studio 2003和2005)中,std :: string类使用分配字符串的组合变体。如果长度很长,则字符串在堆区域中分配,但如果很短,则将其存储在类的预分配区域中

我不知道字符串可能有多长......我不想为它分配任何固定的内存。

我打算做的只是......

wstring somestring;
somestring.sppend(someOtherString); //several times

我想wstring somestring[256]将会在堆栈中,所以我可以很容易地分享。但是如果我不希望分配大小呢?如果尺寸超过阈值会发生什么?

答案

我希望使用共享内存跨进程共享一个std :: string。

您不能跨进程边界共享非POD类型,尤其是可能在内部分配内存的类型。如果他们使用STL,则无法保证其他进程使用相同版本的STL。即使他们这样做了,他们也会使用不同的内存管理器。

您可以改为将固定长度的char[]数组分配为共享内存,并将std::string的字符内容复制到其中。

我想wstring somestring[256]将会在堆栈中,所以我可以很容易地分享。

你不能。 somestring本身将在堆栈上,但它是一个std::wstring对象的数组,并且std::wstring无法共享。

但是如果我不希望分配大小呢?如果尺寸超过阈值会发生什么?

共享内存不是动态大小的。

以上是关于在共享内存中共享std :: string的主要内容,如果未能解决你的问题,请参考以下文章

C 中的共享内存代码片段

在没有共享内存的情况下提升进程间字符串

我可以将 std::atomic<int64> 放在共享内存中并期望原子操作吗?

在共享内存中保持固定大小的符号

共享内存中的队列起作用

df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件