Мне нужно сохранить вектор векторов float в общей памяти в 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;
}
Тем не менее, я понимаю, что это намного сложнее с вектором datatype> вместо простого целого. Нужно ли писать пользовательский распределитель (и если да, есть ли какие-то простые способы сделать это? Примеры, которые я нашел, были довольно сложными...), чтобы сделать эту работу, или есть простое расширение этого примера что позволит мне разместить вектор> в общей памяти?
Невозможно сохранить 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];
}