c++中类的内存分布

#include
using namespace std;


class A{
public:
long a;
};
class B : public A {
public:
long b;
};
void seta(A* data, int idx) { 
data[idx].a = 2; 
}

int main(int argc, char *argv[]) {
B data[4];
for (int i = 0; i < 4; ++i){
data[i].a = 1;
data[i].b = 1;
seta(data, i); //考察类的内存分布,记住了,先是类的首地址,然后成员变量依次在内存中进行存储。
}
for (int i = 0; i < 4; ++i){
std::cout << data[i].a << data[i].b;
}
return 0;
}

这里输出应该是22221111。

此题考查的是类的内存分布。

对单个类来说是在内存中的分布是先存放类的首地址,然后依次存放类的成员变量和成员函数,并满足对齐原则。

如果是有继承,则对基类来说是先存放基类的成员变量,然后再存放子类的成员变量,

void seta(A* data, int idx) { 
data[idx].a = 2; 
}

把data指针转换成了A,变成了父类,然后类的内存分布是依次先排父类的成员变量,再排子类的成员变量。

这里基类只有一个成员变量a,但是内存中分布是abababab,这样子的,所以循环4次,依次进行4次赋值,所以输出22221111.

如果是

void seta(B* data, int idx) { //
data[idx].a = 2;
}

如果这里不进行类别转换,仍然是子类的指针,那么这时候会只对a成员变量进行赋值,不会对子类的b成员变量赋值,输出就会变21212121.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章