一、 sizeof
a. 空类型的sizeof是多大呢?
#include <stdio.h>
#include <iostream>
using namespace std;
struct A{
};
class B{
};
int main()
{
struct A *ptra = (struct A *)malloc(sizeof(struct A));
B *ptrb = new B();
struct A a;
static B b;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(ptra) << endl;
cout << sizeof(ptrb) << endl;
free(ptra);
delete ptrb;
}
结果是:1,1, 8, 8
空类型本来是0,然而声明实例后必须占据一定的存储空间才能访问到,根据编译器决定,GCC是1, 而指针在64位机器上是8。
如果这些变量被声明为全局的或是静态的,就会放在BSS段。
b. 添加构造函数和析构函数
#include <stdio.h>
#include <iostream>
using namespace std;
struct A{
A(){};
~A(){};
};
class B{
public:
B(){};
~B(){};
};
int main()
{
struct A *ptra = (struct A *)malloc(sizeof(struct A));
B *ptrb = new B();
struct A a;
static B b;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(ptra) << endl;
cout << sizeof(ptrb) << endl;
free(ptra);
delete ptrb;
}
仍旧是1,1, 8, 8.因为函数地址不需要存储在结构体当中;
c. 析构函数改为虚函数
#include <stdio.h>
#include <iostream>
using namespace std;
struct A{
A(){};
~A(){};
};
class B{
public:
B(){};
virtual ~B(){};
//~B(){};
};
int main()
{
static struct A *ptra = (struct A *)malloc(sizeof(struct A));
static B *ptrb = new B();
static struct A a;
static B b;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(ptra) << endl;
cout << sizeof(ptrb) << endl;
free(ptra);
delete ptrb;
}
1, 8, 8, 8.
b中就会增加一个指向虚函数表的指针,b也相应的存在data段。