在编译时计算对象的内存位置及其聚合的差异

问题描述 投票:0回答:1

问题:给定

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
    的地址。
c++ cross-platform pointer-arithmetic
1个回答
0
投票

我能想到的一个可能的答案似乎是将政策强加于

A
,即它的所有成员都必须是指针并且站在同一个数组中。

struct A{
  int32_t* members[2];
  A(){
    members[0] = (int32_t*)(new B);
    members[1] = (int32_t*)(new C);
  }
};

在那种情况下,问题中的输出是可以预测的。但是,A 的代码几乎不可读。因此,这将是一个特别糟糕的解决方案。

备注:正如 AviBerger 所暗示的,这里应该使用像

int32_t
这样的类型来断言平台无关的指针算法。

© www.soinside.com 2019 - 2024. All rights reserved.