在以下代码中,为什么sizeof(X) == 4
和sizeof(Y) == 8
?
此外,在类X
中,为什么成员函数不占用任何内存空间?
class X {
int i;
public:
X() { i = 0; }
void set(int ii) { i = ii; }
int read() const { return i; }
int permute() { return i = i * 47; }
};
class Y : public X {
int i; // Different from X's i
public:
Y() { i = 0; }
int change() {
i = permute(); // Different name call
return i;
}
void set(int ii) {
i = ii;
X::set(ii); // Same-name function call
}
};
cout << "sizeof(X) = " << sizeof(X) << endl;
cout << "sizeof(Y) = " << sizeof(Y) << endl;
答案 0 :(得分:2)
类Y
的对象有两个整数成员;类X
的对象有一个。您的评论表明Y
的{{1}}与i
的{{1}}不同,所以看起来您已经知道了答案。
有关类X
的对象实际上有两个i
成员的示例,请参阅http://codepad.org/PZsiyFIk。
此处重复代码:
Y
输出
i
#include <iostream>
using namespace std;
class X {
int i;
public:
X(): i(4) {}
int getI() {return i;}
};
class Y: public X {
int i;
public:
Y(): i(10) {}
int getMyI() {return i;}
};
int main() {
Y y;
cout << y.getI() << ' ' << y.getMyI() << '\n';
}
中只有一个名为4 10
的对象。请注意,main
必须有两个y
字段才能使输出有意义。
答案 1 :(得分:1)
X是基类。只有一个数据成员,即:int i
。 Y是从X派生而来的,有自己的和派生的数据成员。即:两个int i
s。
答案 2 :(得分:1)
此外,在类X中,为什么成员函数不占用任何内存空间?
我认为还没有人报道过这一部分。类的成员函数不存储在对象本身中,因为它们属于类,而不是对象。没有理由在每个对象中存储函数的副本,因为代码总是保持不变。
sizeof(X)
返回存储类型X实例所需的字节数,而不是整个类。
此外,成员函数与内存中的任何其他普通c函数一样存储。它只需要一个指向它所调用对象的指针:
int X::permute() { return i = i * 47; }
...
someX.permute();
变成:
int permute(X* _x) { return _x->i = _x->i * 47; }
...
permute(&someX);
成员函数的概念只是我们使用的抽象。对象实际上唯一包含的是成员变量,也可能是虚函数表。
答案 3 :(得分:0)
X的大小为4,因为它有一个int i
由于基类i +派生类i ,Y的大小为8
成员函数不占用大小,除非你有一个虚函数然后存储vpointer它将有4个字节。