1

我有以下结构:

struct outData{   
    int a;
    float lat, lon;
}

通过共享内存用于IPC。现在我想更新它看起来像这样:

    struct outData{
        int a;   
        std::vector<std::pair<std::string, int>> allInts;
        std::vector<std::pair<std::string, float>> allfloats;
}

为了方便起见,我的共享内存为 4096 字节,因此我不必每次更改结构时都修改 sizeof(outData) 行代码。

当我用动态成员创建这样的结构时,是否保证它们都是在 (int a) 之后创建的,因此在共享内存中?

向量的向量怎么样?

    struct outData{
        int a;   
        std::vector<std::pair<std::string, int>> allInts;
        std::vector<std::pair<std::string, float>> allfloats;
        std::vector<std::pair<std::string, std::vector<byte>>> allByteMessages;
}

哇,感谢您的快速回答!根据您的输入,我制定了此解决方案:

struct outData{
    int *iarray;
    float *farray;
} gtempStruct; 

SetSharedMem(std::vector<std::pair<int, float>> &input)
{
    void * p_v;
    gtempStruct.iarray = new int[input.size()];
    gtempStruct.farray = new float[input.size()];
    fillStruct(input);
    outData *p_oD = (outData *) p_Shm; // p_Shm = pointer to shared memory start
    *p_oD = gtempStruct;
    p_v = p_oD;
    p_v = reinterpret_cast<char*>(p_v) + sizeof(outData) -1;
    p_v = reinterpret_cast<void*>(p_v);
    memcpy(p_v, gtempStruct.iarray, sizeof(int)*input.size())
    p_oD->iarray = (int*) p_v;
    .
    .
    .
}

这行得通,但它没有经过彻底的测试。谢谢!

4

4 回答 4

2

这是行不通的。字符串不会在共享内存中。对象将std::string是,但其内容不会。对于std::vector<byte>. 矢量对象将在共享内存中,但其内容不会。

这两个类都不知道在构造它们时它们的内容有多大。所以他们的静态内容只包含足够的信息来找到他们的动态内容。动态内容是单独分配的。

如果要使用共享内存,则必须在字节级别定义该共享内存的内容。具有内部绝对指针的类将不起作用。如果您需要指针,则必须使它们相对于共享内存段的开头,以便它们在进程之间有意义。

于 2013-03-21T07:33:36.990 回答
1

我不确定您所说的“是否保证它们都是在 (int a) 之后创建的,因此在共享内存中”是什么意思。

但是,我认为您不能在 shmem 中使用带有虚拟表的对象(任何具有至少一个虚拟功能的对象)。当调用任何此类函数(例如析构函数)时,这可能会导致崩溃。

这是对数组使用的内存是动态分配的事实的补充,即实际数组位于其他位置。

您可能需要使用自定义结构,例如:

struct {
    int arraySize;
    int array[];
}
于 2013-03-21T07:39:05.350 回答
1

这几乎不可能,但不值得。

std::string 和 std::vector 类在它们之外存储数据,通常在用 new 分配的堆上。您可以将不同的分配器作为模板参数传递,在这种情况下,将使用该分配器而不是新分配器。理论上,您可以编写一个能够理解您的共享内存的分配器。请注意,编写可靠的分配器很难。

此外,std 结构具有内部指针。如果两个进程中共享内存的虚拟地址不同(这很可能),那么这些指针将指向内存的奇怪部分。

请注意,您可以将普通的旧 c 样式数组放入结构中,这些数组将满足您的需求。包括,你可以使用一个可变长度的结构,前提是你不要对它做非常 c++ish 的事情。

于 2013-03-21T07:41:07.147 回答
0

恐怕行不通。

  • 正如@DavidSchwartz 所指出的,向量会将实际字符串存储在内部管理的内存中(这当然与您拥有的任何专有共享内存机制无关)。
  • 任何非 POD 数据类型通常都有大量自动生成的代码,这些代码将存储在您无法控制的位置:虚拟表、自动生成的构造函数等。有一些方法可以控制这种行为,但这并不是微不足道的,并不总是可能的,也不总是足够好。
于 2013-03-21T07:38:42.003 回答