如何在C++的共享内存中存储浮点向量的向量

How do I store a vector of float vectors in shared memory in C++?

本文关键字:向量 存储 共享 C++ 内存      更新时间:2023-10-16

我需要在C++的共享内存中存储浮点向量的向量。我有一个可行的玩具示例,用于在共享内存中存储整数。这是代码:

int main()
{
    int pid;
    int start = 0;
    int shmid;
    key_t key;
    key = 123;
    int *shm;
    if ((shmid = shmget(key, sizeof(int), IPC_CREAT | 0666)) < 0)
    {
        perror("shmget");
        exit(1);
    }   
    shm = (int *) shmat(shmid, NULL, 0);
    pid = fork();
    if (pid > 0)
    {   
        wait(NULL);
        cout << *shm << *(shm+1);
    }   
    else if (pid == 0)
    {    
        *shm = 6;
        *(shm+1) = 7;
    }   
    else
    {
        exit(-1);
    }   
    cout << endl;
    return 0;
}  

但是,我的理解是,使用数据类型向量而不是简单的整数要困难得多>这要困难得多。我是否需要编写自定义分配器(如果是这样,是否有任何简单的方法可以做到这一点?我找到的例子都非常复杂...要做到这一点,或者这个例子的一个简单的扩展可以让我在共享内存中放置一个向量>?

不可能将

std::vector<T>存储在共享内存区域中,因为向量内的实际元素不会存储在std::vector<T>的内存中,而是在堆上分配。

从技术上讲,您可以构建自己的allocator,但我认为简单地序列化向量的内容更容易。

像这样:

vector<float> vec_f;
// some code fills vec_f .. 
float *shm;
shm = (float *) shmat(shmid, NULL, 0);
for(auto f : vec_f)
{
   *shm++ = f;
}

(或者,如果您不想使用C++样式迭代)

for(size_t i = 0; i < vec_f.size(); i++)
{
    *shm++ = vec_f[i];
}