转载自:http://blog.163.com/xping_lsr/blog/static/19654034520119804131721/

先看两段代码:

代码段1:
class A
{
public:
int print(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}

输出结果:
Size of A =1

代码段2:

class A
{
public:
int print1(){ cout<<"This is A"<<endl;}
int print2(){ cout<<"This is A"<<endl;}
int print3(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}

输出结果:
Size of A =1

对象的大小是它的数据成员所占存储空间之和,就和结构体一样。类中的函数是所有该类对象通用的方法,不算作对象的成员,因此也不算在对象的存储空间内

问题:类里面不管有多少个函数,这个类的对象只占1个字节的内存。这个字节的内存的内容是什么?是指针吗?指针不是占4个字节吗?

当类中类有定义任何变量的时候,类的对象都是1个字节的,当类中没有任何变量的时候,这个类里没有任何真正的成员变量,所以大小应该是0,但0大小不好在内存中定位一个地址,所以,就规定它大小为0的对象要占一字节空间,以便让它拥有一个合法的地址。如果是有派生类的,还有考虑到内存对齐的问题的。

另外涉及到虚函数的话又不一样了。如

class A
{
public:
virtual int print(){ cout<<"This is A"<<endl;}
};
如果sizeof(A)的话,得出的是4。

原因是涉及到虚函数的实现问题。

class Class1

{

m_data1;

m_data2;

virtual vfunc1()

virtual vfunc2()

virtual vfunc3()

};

Class1对象实例

vptr

m_data1

m_data2

通过vptr指针找到虚函数表

Vtable(虚函数表)

(*vfunc1)()

(*vfunc2)()

(*vfunc3)()

Class1::vfunc1()

Class1::vfunc2()

Class1::vfunc3()

所以回到原来的问题,A中只有一个或者几个虚函数的话,没有成员变量,那么类A相当于含有一个vptr指向虚函数表的指针,所以sizeof(A)=4。

还有一点,如

class B

{

};

class B2

{

};

class C:public B

{

};

class D:public virtual B

{

};

class E:public B,public B2

{

};

sizeof(B) = 1;   sizeof(B2) = 1;  sizeof(C) = 1;  sizeof(D) = 4;  sizeof(E) = 1;

空类所占空间为一(上文以解释),单一继承的空类空间也是1,多重继承的空类空间还是1,但是虚继承涉及到虚表(虚指针),所以sizeof(D)=4。

C++ 类里面,函数占用存储空间问题的更多相关文章

  1. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  2. C++类静态成员与类静态成员函数

       当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象 ...

  3. PHP类和函数注释大全

    每次要用PHP的某个功能的时候,都要去查一下,于是决定将PHP所有类和函数都整理出来,加上注释 大致实现 将php.jar文件解压,取出目录stubs 将stubs中的所有php文件中的注释去掉,并做 ...

  4. CString转换成int CString类相应函数

    CString 型转化成 int 型 把 CString 类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程. 虽然通常你怀疑使用_atoi()函数是一个好的选择,它也很少会是一个 ...

  5. c++空指针调用类成员函数

    最近在看C++动态绑定问题时(理解静态绑定时)发现的问题:能用空指针调用类的成员函数(gcc,vs2013下都可以). 例子: class animal { public: void sleep(){ ...

  6. C++中 线程函数为静态函数 及 类成员函数作为回调函数

    线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...

  7. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

  8. 【夯实PHP基础】PHP常用类和函数总结

    本文地址 代码提纲: 1. 字符串处理类及函数 2. 数组处理类及函数 3 .web处理类及函数 将常用的PHP的类和函数总结到这里,主要是 自己用过的,比较有感觉. 1. [字符串处理] 1)[ut ...

  9. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

随机推荐

  1. python数据结构与算法——链表

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

  2. 关于配置服务器(IIS7)

    服务器Server2003 ,无限开机动画慢动作重播,一怒而重装server2008 然,重点就是系统装好了 IIS装好了 ,发布网站 开始各种错了!!! 1.第一个错 额,错误信息说 :由于权限不足 ...

  3. 2016HUAS_ACM暑假集训1A - 士兵队列训练问题

    这道题我觉得是个简单的模拟题,整理一下思路,弄清楚题意就好了. 新手上路,采用两个数组进行交互赋值,用的方法也比较笨,思路差不多都在代码的注释里了. 下面是题目大意: 首先将士兵从1开始编号(士兵总数 ...

  4. kuangbin_MST C (POJ 2031)

    全程double精度就能过了 间接0距离不用管 prim自动连起来的 G++交的话只能用%f输出 C++的话加不加l都可以 (这么说以后用%f肯定不会错咯) 不过我不懂为什么他们的空间时间差了好多倍. ...

  5. PlayerLog.lua --玩家登录通告

    print(">>Script: Player Log Message.") --CLASS 职业 --战士 --圣骑士 --猎人 --盗贼 --牧师 --死亡骑士 - ...

  6. WPF 中保存 window(窗口)或者canvas成图片

    最近需要用到这个功能,搜了一下不少代码有问题 ,找到一个效果比较好的,支持多级子元素 记一下. private void button_save_window_Click(object sender, ...

  7. struts2 的验证框架validation如何返回json数据 以方便ajax交互

    struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror  />才能取出,(EL应该也可以). 如果使 ...

  8. 【转】浏览器内核、渲染引擎、js引擎

    [1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具[2]常见引擎 渲染引擎: firef ...

  9. css中的浮动以及清除浮动

    对于css中的浮动问题,曾经有一段时间我是懵懵懂懂的感觉,对于float这个属性一直是似懂非懂的赶脚,对于这种让我们一直懵懵懂懂的知识点,我们就需要找个时间点,仔仔细细的去将它搞懂,从这个过程中我们也 ...

  10. bootstrap初接触

    Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架.(主要是结合HTML5 CSS3的样式, 基于jquery+Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以 ...