空类、含静态成员的类、普通类(不含虚函数、虚继承)的sizeof大小
2013-07-03 10:17
239 查看
空类、含静态成员的类、普通类(不含虚函数、虚继承)的sizeof大小
#include <iostream>using namespace std;
class CEmpty
{
};
class CStaticMember
{
static int a;
};
///////////////////////////////////////////////////////////////
class CCharShortChar
{
char a;
short b;
char c;
};
class CCharCharShort
{
char a;
char c;
short b;
};
///////////////////////////////////////////////////////////////
#pragma pack(1)
class CCharShortCharPack1
{
char a;
short b;
char c;
};
class CCharCharShortPack1
{
char a;
char c;
short b;
};
#pragma pack()
///////////////////////////////////////////////////////////////
class CCharInt
{
char a;
int b;
};
class CCharDouble
{
char a;
double b;
};
class CCharShortIntDouble
{
public:
char a;
short b;
int c;
double d;
};
int main()
{
cout << "sizeof(CEmpty) = " << sizeof(CEmpty) << endl;
cout << "sizeof(CStaticMember) = " << sizeof(CStaticMember) << endl;
cout << "sizeof(CCharShortChar) = " << sizeof(CCharShortChar) << endl;
cout << "sizeof(CCharCharShort) = " << sizeof(CCharCharShort) << endl;
cout << "sizeof(CCharShortCharPack1) = " << sizeof(CCharShortCharPack1) << endl;
cout << "sizeof(CCharCharShortPack1) = " << sizeof(CCharCharShortPack1) << endl;
cout << "sizeof(CCharInt) = " << sizeof(CCharInt) << endl;
cout << "sizeof(CCharDouble) = " << sizeof(CCharDouble) << endl;
CCharShortIntDouble csid;
cout << "sizeof(CCharShortIntDouble) = " << sizeof(CCharShortIntDouble) << endl;
cout << "b - a = " << (int)&csid.b - (int)&csid.a << endl;
cout << "c - b = " << (int)&csid.c - (int)&csid.b << endl;
cout << "d - c = " << (int)&csid.d - (int)&csid.c << endl;
return 0;
}
//[VC2008运行结果]
//sizeof(CEmpty) = 1
//sizeof(CStaticMember) = 1
//sizeof(CCharShortChar) = 6
//sizeof(CCharCharShort) = 4
//sizeof(CCharShortCharPack1) = 4
//sizeof(CCharInt) = 8
//sizeof(CCharDouble) = 16 # 这一行VC2008和GCC结果不一致
//sizeof(CCharShortIntDouble) = 16
//b - a = 2
//c - b = 2
//d - c = 4
//请按任意键继续. . .
//[GCC 4.4.5 运行结果]
//sizeof(CEmpty) = 1
//sizeof(CStaticMember) = 1
//sizeof(CCharShortChar) = 6
//sizeof(CCharCharShort) = 4
//sizeof(CCharShortCharPack1) = 4
//sizeof(CCharInt) = 8
//sizeof(CCharDouble) = 12 # 这一行VC2008和GCC结果不一致
//sizeof(CCharShortIntDouble) = 16
//b - a = 2
//c - b = 2
//d - c = 4
//[备注]
//1, 空类的sizeof为1, 空类也能实例化, 而实例化的对象都有内存的地址, 因此最少要1个字节来表示实例在对象中的位置.
//2, 静态成员不占用sizeof的大小, 因为静态类成员是存储在静态存储区, 所有的实例和类共享.
//3, 相同的类成员, 不同的内部排列方式由可能会导致sizeof不同, 如上述的CCharShortChar和CCharCharShort, 具体大小和内存对齐布局的时候有关.
//4, 如果指定了对齐尺寸#pragma pack(n), 则内存布局按照n字节对齐. 恢复编译器默认对齐则使用#pragma pack().
//5, 默认的内存对齐尺寸和成员的尺寸以及编译器的设置相关, 如上述的CCharDouble在VC和GCC下sizeof不同. (测试发现VC中按照成员最大值对齐, GCC按照min(系统默认的4, 成员最大值)对齐)
包含虚函数或者是虚基类的类,由于需要存储虚函数表指针和虚基类表指针,sizeof值会有所增加,但是不同的编译器实现不同,sizeof的值也不一定相同(比如虚继承的类VC和GCC中的sizeof不同),这个后续再实验和总结。
手工计算sizeof本来没有多大的意义,直接在程序中使用sizeof计算就好。讨论手工计算sizeof的意义最主要的是了解部分内部的细节以及C++的设计思想。
另外,最好不要对类实例使用memset,因为如果类中包含了虚函数或者是虚继承,那会导致虚函数表指针或者虚基类指针破坏而让程序crash。
相关阅读:
http://hi.baidu.com/luosiyong/blog/item/331aa8ee0f159f092df5341e.html
http://hi.baidu.com/luosiyong/blog/item/2073c4dcfc2b1f81cd1166fe.html
相关文章推荐
- C++普通函数,普通成员函数、静态成员函数的区别
- 大小测试(空类、带含静态和非含、虚和非虚的单继承和多继承等)
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- 普通函数,成员函数,静态成员函数与【指针】
- 静态成员函数和普通成员函数的区别
- 继承中的静态成员函数
- 静态成员(成员函数+数据成员)继承中同样存在覆盖基类,而非共存子类
- 静态变量和静态成员函数的继承
- 动态及静态数组大小,strlen()函数与sizeof()c操作符
- 继承与静态成员函数
- 静态成员函数与普通成员函数的区别
- 普通成员函数调用静态成员数据
- C++中各种空类以及继承空类后的sizeof大小
- 类大小测试(空类、带含静态和非含、虚和非虚的单继承和多继承等)
- Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序
- Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte
- 类中的三种函数(普通成员函数、静态成员函数、COSNT成员函数)总结
- 静态成员函数和普通成员函数的区别?
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况