我有以下结构:
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/