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.


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