先看一段代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
struct A
{
double b;
//int c ;
double d;
int a;
int f;
int t;
char g;
char g1;
char g3;
int vv;
char g4;
//char g5;
};
class X
{
double i;
public:
X(){i = 0;};
};
class Y: public X
{
private:
int i;
//int j;
X x;
public :
Y(){ i = 0;}
};
class B
{
};
int main()
{
using namespace std;
cout << sizeof(A) << endl;
cout << sizeof(X) << endl << sizeof(Y) << endl;
cout << sizeof(B) << endl;
}
解释:
第一个sizeof(A)的大小是因为内存分配的效率问题, 所以都会以类里面占用字节最大的 基本类型 double 为标准划分, 也就是最后大的的double 的整数倍, 又因为数据是按照在类里面声明的顺序储存的, 所以不够的就当一个double, 所以在A里面a, f占用一个double, t, g, g1, g3占用一个double(即使不够8字节也得占用8字节), 最后v和g4占用一个double, 所以一供就是4个double = 40字节
第二个sizeof(X) 的大小就不解释了就是8
第三个sizeof(Y) 这个大小不好理解, 由于是从x继承过来的, 即使在y中声明了一个和x里面变量相同的变量i, 那么也只是将x继承下来的i给隐藏了, 所以y里面有两个i(一个x的, 一个y的);同时y里面还有一个X 型的x变量, 这个x是占用8个字节的; 综上所述, y里面的int i 和x里面的double i 不是同一个, 所以y里面实际有int i, double i(被隐藏), X x 三个变量, 按照A 的大小规则, 就是三个double,那么结果是24
第四个sizeof(B) 是由于编译器为了区分对象的地址强制给空得类添加一个字节(要是空的就没法开地址空间了, 也就没办法区分对象);