问题:给定
B
和 C
的完整代码,能否可靠地预测以下程序的输出?
如果答案是“否”(例如由于平台依赖),那么:有没有办法让它可预测(例如,通过使用某些分配/对齐技术)。
struct B{
// ...
};
struct C{
// ...
};
struct A{
B b;
C c;
};
int main(){
A a;
long db = (int*)(&a.b) - (int*)(&a );
long dc = (int*)(&a.c) - (int*)(&a.b);
std::cout << "difference a.b to a : " << db << "\n";
std::cout << "difference a.c to a.b : " << dc << "\n";
}
备注:
int*
只是因为cpp不允许使用void*
afaik.db,dc
在另一个编译时从 b
的给定对象计算 c
和 A
的地址。我能想到的一个可能的答案似乎是将政策强加于
A
,即它的所有成员都必须是指针并且站在同一个数组中。
struct A{
int32_t* members[2];
A(){
members[0] = (int32_t*)(new B);
members[1] = (int32_t*)(new C);
}
};
在那种情况下,问题中的输出是可以预测的。但是,A 的代码几乎不可读。因此,这将是一个特别糟糕的解决方案。
备注:正如 AviBerger 所暗示的,这里应该使用像
int32_t
这样的类型来断言平台无关的指针算法。