目录
1.类的成员变量
1.1非静态成员变量
#include "stdafx.h"
#include <iostream>
using namespace std;
class A {
};
class B {
private:
short a;
};
class B1 {
public:
short a;
};
class C {
private:
short a;
int b;
};
class C1 {
public:
short a;
int b;
};
int main() {
A a;
B b;
C c;
B1 b1;
C1 c1;
cout << "A:" << sizeof(A) <<";a:"<<sizeof(a)<< endl;
cout << "B:" << sizeof(B) << ";b:"<<sizeof(b)<< ";B1:" << sizeof(B1) << ";b1:"<<sizeof(b1)<<endl;
cout << "C:" << sizeof(C) <<";c:"<<sizeof(c)<< ";C:" << sizeof(C1) <<";c1:"<<sizeof(c1)<< endl;
return 0;
}
结果:
说明:
1.类在实例化对象时需要在内存中分配一块独一无二的地址,为了空类的实例能够有一块独一无二的地址,编译器会给空类隐含的添加一个字节。
2.类的大小等于成员变量大小之和,sizeof(short)=2,所以Sizeof(B)==2.
3.多个成员变量时,需要字节对齐。C的第一个成员变量存放在offset为0的地方,第二个成员变量占4字节,故编译器插入2个字节凑足4的整数倍,使得第二个成员变量存放在offset为4的地方。
4.类的内存大小,与成员变量的访问属性无关,无论是public还是private都分配相同的内存。
1.2静态成员变量
代码例子:
// ClassAllocateMemory_static.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class A {
};
class C {
public:
static int a;
};
class B {
public:
int a;
};
class D{
public:
int b ;
static int a;
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "A:" << sizeof(A) <<endl;
cout << "B:" << sizeof(B) <<endl;
cout << "C:" << sizeof(C) <<endl;
cout << "D:" << sizeof(D) <<endl;
return 0;
}
输出:
说明:
类A的大小等于类C的大小,类D的大小与类B的大小相等,说明静态成员变量不占用类的内存。
因为静态成员变量存放在静态区。
2.类的函数
// ClassAllocateMemory_static.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class A {
public:
int a;
};
class B {
public:
int a;
static int fun1(){return 0;}
};
class C {
public:
int a;
int fun(){return 0;}
};
class D{
public:
int b ;
virtual int fun2() {return 0;}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "A:" << sizeof(A) <<endl;
cout << "B:" << sizeof(B) <<endl;
cout << "C:" << sizeof(C) <<endl;
cout << "D:" << sizeof(D) <<endl;
return 0;
}
输出:
说明:
可以看到类的静态成员函数和成员函数都不属于类和对象,因为成员函数和全局函数等都在代码段。掉用成员函数时会隐式的传个this过去,这个this作用其实就是将对象内所有成员变量传递进去。
虚函数会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表)。指针占用字节和机器字长有关,在32位机器上是4字节,如果在64位机器上,则是8个字节 。此处占用4个字节。