好的,所以我有几个共享内存块的进程。这些内存块是具有 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 的原因是最初的结构 bar 只是将这些 var1 和 var2 作为纯数据成员而没有 fooArray。决定扩展它并将这些数据放在一个数组中。bar 结构的实际代码和范围非常大,我真的不想进入数百个源文件并将每个 barObj.var1 更改为 barObj.fooArray[0].var1,特别是因为名称 var1 是不是 struct bar 独有的(所以我不能进行搜索/替换)。
进行引用的问题是存储在 bar 类中以表示这些引用的内部指针不是进程间兼容的。如果您在一个进程中的共享内存中构造一个 bar 对象,然后尝试在另一个进程中访问该对象的 bar::var1 引用,则会出现段错误。(这是意料之中的)
我的问题是:有没有办法强制编译器识别 bar::var1/var2 实际上只是本地子结构的别名,所以它只是“编译掉”引用?无论如何实例化每个对象,bar::var1/2 的初始化程序都不会改变,所以我认为这是可能的,但我还没有弄清楚如何去做。