c++ 类中的成员是否保证是连续的?

Dor*_*ugi 2 c++ memory-management

C++ 中的类成员是否保证是连续的?

我已经尝试与几乎所有流行的C ++编译器运行下面的代码,以及所有它们的产率的结果如图4所示,它是变量y的相对地址。这是巧合,还是语言规范保证是这种方式?编译器是否有可能不会使成员 x 和 y 与类基本地址相邻/彼此相邻?

请注意,线程不回答此问题。

#include <iostream>

using namespace std;

class A {
public:

    void f(){
        cout << &(this->y) << endl;
    }

    int x, y;
};


int main(int argc, const char* argv[])
{
    A *a = 0;
    a->f();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 5

因为你的类不是多态类型,没有基类,并且所有的成员都是public,地址x是保证类的地址。

此外, 的地址y保证的地址之后x,尽管它们之间可以有任意数量的填充所以是的,你的结果是巧合。

如果您的类是多态的,即virtual在它或基类的某处有一个函数,或者成员是protectedprivate,那么所有的赌注都将关闭。

因此,在您的情况下,(void*)&(this->x)is (void*)this,并且 的地址this->y必须高于 的地址this->x

最后,如果您需要类成员是连续的,并且可以通过指针算术相互访问,请使用

int x[2];
Run Code Online (Sandbox Code Playgroud)

而是作为会员。

  • @Oliv:“可能导致”是这里的关键:因此你需要假设它会发生,否则你就不会编写可移植的 C++。 (2认同)
  • @Bathsheba 我认为标准布局结构的规范对于与 C 兼容是必要的,但这还不够。例如,编译器可以在 C++ 中添加比在 C 中更多的填充。 (2认同)