我需要在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;
}
然而,我的理解是,使用数据类型向量&gt;这要困难得多。而不是一个简单的整数。我是否需要编写一个自定义分配器(如果有的话,有没有简单的方法可以做到这一点?我发现的例子都非常复杂......)使这个工作,或者是否有一个简单的扩展这个例子这将让我放置一个矢量&gt;在共享内存?
答案 0 :(得分: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];
}