好的,所以我有几个共享内存块的进程。这些内存块是具有类型bar的成员对象的数据结构。
// in header bar.hpp
struct foo {
double var1;
double var2;
foo()
: var1(0.0),
var2(0.0)
{}
};
struct bar {
foo fooArray[5];
double & var1;
double & var2;
bar()
: fooArray(),
var1(fooArray[0].var1),
var2(fooArray[0].var2)
{}
bar(const bar& a)
: fooArray(),
var1(fooArray[0].var1),
var2(fooArray[0].var2)
{*this = a;}
void operator=(const bar& a) {
for(int i=0; i<5; ++i) fooArray[i] = a.fooArray[i];
}
};
共享内存数据结构:
struct shmType {
bar data;
};
引用bar :: var1和bar :: var2的原因是原来结构栏只是将这些var1和var2作为普通数据成员而没有fooArray。决定扩展它并将这些数据放在一个数组中。 bar结构的实际代码和范围非常大,我真的不想进入数百个源文件并将每个barObj.var1更改为barObj.fooArray [0] .var1,特别是因为名称var1是结构栏不是唯一的(所以我不能进行搜索/替换)。
执行引用的问题是存储在bar类中以表示这些引用的内部指针不是进程间兼容的。如果在一个进程中在共享内存中构造一个bar对象,然后尝试在另一个进程中访问该对象的bar :: var1引用,则会出现seg错误。 (这是预期的)
我的问题是:有没有办法强制编译器识别bar :: var1 / var2实际上只是本地子结构的别名,所以它只是“编译”引用?无论每个对象如何实例化,bar :: var1 / 2的初始化程序都不会改变,所以我认为它是可能的,但我还没弄清楚如何做到这一点。
答案 0 :(得分:0)
根据您的编译器,您可以使用匿名union
和匿名struct
。 请注意,这不是标准C ++ ,它实际上取决于您的编译器(GCC允许它,我不了解其他人),因此如果您想编写可移植代码,则可能非常脆弱。
struct Foo {
int x, y;
};
struct Bar {
union {
Foo fooArray[5];
struct {
int x;
int y;
}; // warning: ISO C++ prohibits anonymous structs [-pedantic]
};
};
但是,我支持我的评论:最好的解决方案可能是重构整个事情并使用访问器而不是公共变量。这将在未来为您节省许多麻烦。