通常我们定义一个类,它所占的空间有多大呢?

首先我们看一下下面的这个类

class A{
public:
void func1(void){
printf("11111heihei\n");
};
void func2(void){
printf("11111heihei\n");
};
public:
int number;
};
class B{
public:
void func1(void){
printf("heihei\n");
};
void func2(void){
printf("heihei\n");
};
public:
char number;
int number1;
};

我们输出这两个类的长度

 #include <stdio.h>
class A{
public:
void func1(void){
printf("11111heihei\n");
};
void func2(void){
printf("11111heihei\n");
};
public:
int number;
};
class B{
public:
void func1(void){
printf("heihei\n");
};
void func2(void){
printf("heihei\n");
};
public:
char number;
int number1;
};
int main(){
printf("A %d B %d\n",sizeof(A),sizeof(B));
getchar();
return ;
}

得到结果:

  至于为什么第二个是8,就是内存对齐的问题了,可以参考之前的内存申请的帖子。

  我们发现,一个类的长度是它的变量所占用的空间,也就是说函数是不占用空间的。这是因为一个类的变量时属于对象的,而一个类的函数是属于这个类的。

  那么因对象不同而不同的虚函数又会怎样呢?

  我们接着看下面两个类:

class A{
public:
virtual void func1(void){
printf("11111heihei\n");
};
void func2(void){
printf("11111heihei\n");
};
public:
int number;
};
class B{
public:
virtual void func1(void){
printf("heihei\n");
};
virtual void func2(void){
printf("heihei\n");
};
public:
int number1;
};

  按照下面的函数输出,得到结果:

 #include <stdio.h>
class A{
public:
virtual void func1(void){
printf("11111heihei\n");
};
void func2(void){
printf("11111heihei\n");
};
public:
int number;
};
class B{
public:
virtual void func1(void){
printf("heihei\n");
};
virtual void func2(void){
printf("heihei\n");
};
public:
int number1;
};
int main(){
printf("A %d B %d\n",sizeof(A),sizeof(B));
getchar();
return ;
}

  我们发现,多了4个字节。这是因为虚函数要为对象分配一个虚函数表vptr,通过这个指针来调用虚函数。因此有虚函数的类,会多出一个指针的空间。但仅仅分配一个指针。比如第一个函数会用vptr[1]来表示,第二个用vptr[2]来表示,而索引0是表的信息。

  如有不对的地方,还请多多指正。

c++中类长度解析的更多相关文章

  1. lua table长度解析

    先来看lua table源码长度获取部分(ltable.c) j是数组部分的长度.首先判断数组长度大于0,并且数组最后一个是nil,就用二分法查找,返回长度. 如果t->node是 table的 ...

  2. mysql 5 长度解析

    mysql 5 以后 都按照字符来算 不是字节 char(10)可以放10个汉字或者10个字母

  3. 虚拟机VHD格式解析到NTFS文件系统解析

    本来的需求是XEN下的镜像取证,但这篇仅包括他支持的一种格式,就是VHD,此项目从头开始大概用了两周时间,中间遇到了很多让人头大的问题,光是思考的笔记就写了十几页纸,不过实际上并没有那么难,主要是很久 ...

  4. netty 粘包问题处理

    netty 粘包问题处理 key words: netty 粘包 解包 半包 TCP 一般TCP粘包/拆包解决办法 定长消息,例如每个报文长度固定,不够补空格 使用回车换行符分割,在包尾加上分割符,例 ...

  5. node实现一个WEBSOCKET服务器

    早点时候翻译了篇实现一个websocket服务器-理论篇,简单介绍了下理论基础,本来打算放在一起,但是感觉太长了大家可能都看不下去.不过发现如果拆开的话,还是不可避免的要提及理论部分.用到的地方就简要 ...

  6. WebSocket协议详解与c++&c#实现

    摘要: 随着手机游戏.H5游戏以及微信小游戏的普及,越来越多的客户端-服务器端的通讯采用websocket协议.Websocket协议是全双工的.基于数据帧的.建立在tcp之上的长连接协议.Webso ...

  7. JavaScript之从浏览器一键获取教务处个人课程信息【插件】

    由于博主的个人网站(:http://www.johnnyzen.cn/),每学期都需要更新呈现课程的静态信息,由于课程量多,而且手动爬取很冗杂,特别想自动化实现.这不,今天终于有点时间了,把之前写no ...

  8. Netty源码分析第6章(解码器)---->第1节: ByteToMessageDecoder

    Netty源码分析第六章: 解码器 概述: 在我们上一个章节遗留过一个问题, 就是如果Server在读取客户端的数据的时候, 如果一次读取不完整, 就触发channelRead事件, 那么Netty是 ...

  9. Netty源码分析第6章(解码器)---->第4节: 分隔符解码器

    Netty源码分析第六章: 解码器 第四节: 分隔符解码器 基于分隔符解码器DelimiterBasedFrameDecoder, 是按照指定分隔符进行解码的解码器, 通过分隔符, 可以将二进制流拆分 ...

随机推荐

  1. C# 模拟POST提交文件

    http://blog.csdn.net/hellowjwang/article/details/19975635 public class HttpPost { /// <summary> ...

  2. 判断浏览器类型-----------navigator.userAgent.indexOf()

    <script language="JavaScript"> <!-- function getOs() { var OsObject = "" ...

  3. 树莓派raspbian安装配置(基本配置+中文配置+远程桌面+lighttpd+php+mysql)

    raspbian为树莓派的官方系统,基于Debian裁剪过的Linux系统 其配置过程如下 烧录镜像 首先从树莓派的官方网站上下载镜像和镜像工具 http://www.raspberrypi.org/ ...

  4. 学习Java Web开发

    学习DreamWaveMX中文版的网页设计技术 HTML网页设计,这是最基本的.学习XML的一些基本知识.初步掌握一些JSCRIPT的应用. 学习JAVA语言. 这应该分成2次来进行: 第1次找一本国 ...

  5. [转载]Java的内存回收机制

    转自:http://www.admin10000.com/document/1671.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由J ...

  6. poj2376

    最少区间覆盖问题: 首先我们想到将r排序,则以得出dp方程 f[i]=1 (l[i]=1) =min{f[j]}+1 (r[j]+1>=l[i]) 最后ans是min{f[j]} (r[j]&g ...

  7. mac osx 升级yosemite后java出错的解决

    原文  http://www.cnblogs.com/walkerwang/p/4034152.html

  8. ExtJs双ActionResult共用同一Js文件ID冲突解决方案

    项目使用MVC+ExtJs实现,权限控制是基于Controller下的ActionResult的,有一个页面因参数不同就需要新建两个ActionResult. 不要问我为何是基于页面级,而不是数据级, ...

  9. SharePoint 2010 使用自定义aspx页面替换列表默认的新建(NewForm.aspx),查看(DispForm.aspx)和编辑(EditForm.aspx)页面

    转:http://www.cnblogs.com/sygwin/archive/2011/11/04/2236678.html 如何使用自定义的aspx页(比如Application Page)替换列 ...

  10. NopCommerce架构分析之四----插件机制

    NopCommerce支持灵活的插件机制,所谓Web系统插件,其实也就是可以像原系统的一部分一样使用. Web系统的使用方式就是客户端发送一个请求,服务端进行解析.在asp.net MVC中对客户请求 ...