1. 计算方法:
类的实例化就是在内存中分配一块地址。 类的大小与它当中的构造函数,析构函数,静态数据成员,非虚成员函数,静态成员函数无关,只与它当中的非静态成员数据以及虚函数有无有关; 类的静态数据成员被编译器放在程序的一个global data members
中,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在; 空类同样可以被实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址; 虚函数的原因,有一个指向虚函数的指针(虚函数表),在32位的系统分配给指针的大小为4个字节。
#include <iostream>
using namespace std;
class A {
} ;
class B {
char b;
} ;
class C {
char a;
int b;
} ;
class D {
char a;
int b;
virtual void func ( ) { } ;
} ;
class E {
char a;
int b;
virtual void func1 ( ) { } ;
virtual void func2 ( ) { } ;
} ;
class F {
char a;
int b;
virtual void func1 ( ) { } ;
virtual void func2 ( ) { } ;
void func3 ( ) { } ;
} ;
class G {
char a;
int b;
static int c;
virtual void func1 ( ) { } ;
virtual void func2 ( ) { } ;
void fun3 ( ) { } ;
} ;
class H {
char a;
int b;
static int c;
virtual void fun ( ) { } ;
virtual void fun2 ( ) { } ;
void fun3 ( ) { } ;
void fun4 ( ) { } ;
void fun5 ( ) { } ;
void fun6 ( ) { } ;
} ;
int G:: c{ 0 } ;
int H:: c{ 0 } ;
int main ( ) {
A a;
B b;
C c;
D d;
E e;
F f;
G g;
H h;
cout << sizeof ( a) << endl;
cout << sizeof ( b) << endl;
cout << sizeof ( c) << endl;
cout << sizeof ( d) << endl;
cout << sizeof ( e) << endl;
cout << sizeof ( f) << endl;
cout << sizeof ( g) << endl;
cout << sizeof ( h) << endl;
return 0 ;
}
输出:
1
1
8
16
16
16
16
16