c++ - 共享内存中的 vector 结构

标签 c++ memory vector struct ipc

我有以下结构:

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) 之后创建的,因此在共享内存中?

vector 的 vector 怎么样?

    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;
    .
    .
    .
}

这是有效的,但还没有经过彻底的测试。 谢谢!

最佳答案

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

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

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

关于c++ - 共享内存中的 vector 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15541764/

相关文章:

c# - 如何更改我的 C++ 代码以用作 C# 中的 DLL?

c++ - 根据字符串获取结构元素 vector 的值

c++ - 为什么更改链接顺序可以修复一个系统上的一些链接错误?

java - 如何在 Java Netbeans 平台模块化项目中设置 VM 选项?

c++ - 由于某种原因,我的 ram 上的 int 重量超过 32 位

c - 用 char* 分配内存

c++ - 搜索 map 和打印 vector

c++ - 覆盖 C++ 派生类中的数据成员

c++ - 初始化具有大小的对象 vector 时出错

c++ - 为每个循环将迭代器分配给 std::vector 的当前元素