C++类所占内存大小计算,sizeof关键字
来源:互联网 发布:硬盘 检测 软件 编辑:程序博客网 时间:2024/06/05 00:40
文章出处:http://blog.csdn.net/chenchong08
作者联系方式:vision_chen@yeah.net
说明:笔者的操作系统是32位的。
class A {};
sizeof( A ) = ?
sizeof( A ) = 1
明明是空类,为什么编译器说它是1呢?
空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以sizeof( A )的大小为1.
class B
{
public:
B() {}
~B() {}
void MemberFuncTest( int para ) { }
static void StaticMemFuncTest( int para ){ }
};
sizeof( B ) = ?
sizeof( B ) = 1
类的非虚成员函数是不计算在内的,不管它是否静态。
class C
{
C(){}
virtual ~C() {}
};
sizeof( B ) = ?
sizeof( B ) = 4
类D有一个虚函数,存在虚函数的类都有一个一维的虚函数表叫虚表,虚表里存放的就是虚函数的地址了,因此,虚表是属于类的。这样的类对象的前四个字节是一个指向虚表的指针,类内部必须得保存这个虚表的起始指针。在32位的系统分配给虚表指针的大小为4个字节,所以最后得到类C的大小为4.
class D
{
D(){}
virtual ~D() {}
virtual int VirtualMemFuncTest1()=0;
virtual int VirtualMemFuncTest2()=0;
virtual int VirtualMemFuncTest3()=0;
};
sizeof( D ) = ?
sizeof( D ) = 4
原理同类C,不管类里面有多少个虚函数,类内部只要保存虚表的起始地址即可,虚函数地址都可以通过偏移等算法获得。
class E
{
int m_Int;
char m_Char;
};
sizeof( E ) = ?
sizeof( E ) = 8
32位的操作系统int占4个字节,char占一个字节,加上内存对齐的3字节,为8字节。
class F : public E
{
static int s_data ;
};
int F::s_data=100;
sizeof( F ) = ?
sizeof( F ) = 8
类F为什么跟类E一样大呢?类F的静态数据成员被编译器放在程序的一个global data members中,它是类的一个数据成员,但是它不影响类的大小,不管这个类实际产生了多少实例还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在.可以这么说,类的静态数据成员是一种特殊的全局变量.
class G : public E
{
virtual int VirtualMemFuncTest1(int para)=0;
int m_Int;
};
class H : public G
{
int m_Int;
};
sizeof( G ) = ?
sizeof( H ) = ?
sizeof( G ) = 16
sizeof( H ) = 20
可以看出子类的大小是本身成员的大小再加上父类成员的大小.如果父类还有父类,也加上父类的父类,这样一直递归下去。
class I : public D
{
virtual int VirtualMemFuncTest1()=0;
virtual int VirtualMemFuncTest2()=0;
};
sizeof( I ) = ?
sizeof( I ) = 4
父类子类工享一个虚函数指针,虚函数指针保留一个即可。
总结:
空的类也是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。
(一)类内部的成员变量:
普通的变量:是要占用内存的,但是要注意内存对齐(这点和struct类型很相似)。
static修饰的静态变量:不占用内存,原因是编译器将其放在全局变量区。
从父类继承的变量:计算进子类中
(二)类内部的成员函数:
非虚函数(构造函数、静态函数、成员函数等):不占用内存。
虚函数:要占用4个字节(32位的操作系统),用来指定虚拟函数表的入口地址。跟虚函数的个数没有关系。父类子类工享一个虚函数指针。
构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。
测试代码如下:
Windows 7 32位 VC 2010运行结果:
Linux(cent os 6.2 32位)运行结果:
----------------------------------
sizeof的理解
- sizeof运算符,c语言的一个关键字,非函数
- 求某个数据类型,某个变量对应的数据类型 在当前平台下所需要占用内存空间的大小。
- 并不是求某个变量本身的内存大小,不会涉及到对这个内存空间的访问(不存在越界,只要合理就行)。
// 32位平台下int a[10];char *ptr;//a是一个一位数组类型cout << sizeof(a) << endl; // 40// 虽然越界了,但是sizeof操作并没有访问那个内存地址,// 所以a[100]的类型就是个intcout << sizeof(a[100]) << endl; // 4 cout << sizeof(a[1]) << endl; // 4// ptr是一个指针类型,32位指针本身占4个字节cout << sizeof(ptr) << endl; // 4// sizeof(*ptr) 是求ptr指向类型的大小,一个char类型,占用1个字节cout << sizeof(*ptr) << endl; // 1cout << sizeof(char) << endl; // 1// sizeof(int) *ptr,中间没有运算符,编译出错//sizeof(int)*ptr;
参考如下讲解sizeof的博文
http://blog.csdn.net/kiddy19850221/article/details/6655002
msdn C++语言的讲解,建议切换成英文的
https://msdn.microsoft.com/zh-cn/library/3bstk3k5.aspx
sizeof语法
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // sizeof( 类型 );
3) sizeof object; // sizeof 对象;
所以
int i;
sizeof( i ); // ok
sizeof i; // ok
sizeof( int ); // ok
sizeof int; // error
sizeof 性质 实例
class A{};void fun(){cout << "fun" << endl;}// sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用char s[sizeof(int) + 1];int main(){cout << sizeof(2) << endl; // int 4 cout << sizeof(2 + 3.14) << endl; //double 8cout << sizeof A << endl; // empty object 1// sizeof(fun);// sizeof的操作符不能是函数cout << sizeof(s) << endl; // 5 return 0;}
sizeof求 数组,指针等问题
int main(){char *s3 = "12345678"; // "12345678"是字符串常量,s3是一个指向字符串常量的指针// s3[1] = 'A'; 出错,不能修改常量区cout << sizeof(s3) << endl; // 4s3 = "13"; // 改变 s3的指向cout << sizeof(s3) << endl; // 4return 0;}
int main(){char s3[] = "12345678"; // "12345678"在栈上(后面有个\0),s3是个数组名,s3[1] = 'A'; cout << sizeof(s3) << endl; // 9cout << sizeof(s3 + 0) << endl; // 4, s3[0] 的地址 指针cout << sizeof(s3 + 1) << endl; // 4, s3[1] 的地址 指针return 0;}
char * , char[]的区别参考
http://blog.csdn.net/qq_26437925/article/details/52136298
sizeof(void)
类大小易错题例子1
拓展问题,C++ 类默认产生哪些成员函数
http://www.cnblogs.com/ltang/archive/2010/10/08/1861145.html
- C++类所占内存大小计算,sizeof关键字
- sizeof计算对象所占内存大小详解
- C++类所占内存大小计算
- C++类所占内存大小计算
- C++类所占内存大小计算
- C++类的所占内存大小计算)
- C++类所占内存大小计算
- C++类所占内存大小计算
- C++类所占内存大小计算
- 类所占内存大小
- 如何计算结构体所占内存大小
- c语言 union 所占内存大小问题
- 不使用sizeof 判断一个数据所占的内存大小
- 使用sizeof计算类对象所占空间大小
- 使用 sizeof 计算类对象所占空间大小
- 不用sizeof计算数据类型所占字节
- sizeof - 计算对象所占字节
- 影响类所占内存大小的因素
- 日期转换工具包(DateUtil)
- 在Microsoft SQL Server 2008中,将一张表的某列的值转换为列名称
- HDU 3951 Coin Game (博弈论、对称性)
- Ajax实现异步请求的整个过程
- (九)maven核心概念-坐标
- C++类所占内存大小计算,sizeof关键字
- JS 字符串操作API
- 小红书架构演进
- Linux进程间通信——使用信号
- Mac下修改Android Studio的默认JDK版本,与eclipse产生的问题冲突
- 根据进程句柄 获得可执行文件路径 的几种方法
- smarty基础知识详解
- (论文+代码)R-FCN:基于区域的全卷积神经网络进行物体检测
- HTML&CSS基础学习笔记1.22-文章布局