c++中类长度解析
通常我们定义一个类,它所占的空间有多大呢?
首先我们看一下下面的这个类
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++中类长度解析的更多相关文章
- lua table长度解析
先来看lua table源码长度获取部分(ltable.c) j是数组部分的长度.首先判断数组长度大于0,并且数组最后一个是nil,就用二分法查找,返回长度. 如果t->node是 table的 ...
- mysql 5 长度解析
mysql 5 以后 都按照字符来算 不是字节 char(10)可以放10个汉字或者10个字母
- 虚拟机VHD格式解析到NTFS文件系统解析
本来的需求是XEN下的镜像取证,但这篇仅包括他支持的一种格式,就是VHD,此项目从头开始大概用了两周时间,中间遇到了很多让人头大的问题,光是思考的笔记就写了十几页纸,不过实际上并没有那么难,主要是很久 ...
- netty 粘包问题处理
netty 粘包问题处理 key words: netty 粘包 解包 半包 TCP 一般TCP粘包/拆包解决办法 定长消息,例如每个报文长度固定,不够补空格 使用回车换行符分割,在包尾加上分割符,例 ...
- node实现一个WEBSOCKET服务器
早点时候翻译了篇实现一个websocket服务器-理论篇,简单介绍了下理论基础,本来打算放在一起,但是感觉太长了大家可能都看不下去.不过发现如果拆开的话,还是不可避免的要提及理论部分.用到的地方就简要 ...
- WebSocket协议详解与c++&c#实现
摘要: 随着手机游戏.H5游戏以及微信小游戏的普及,越来越多的客户端-服务器端的通讯采用websocket协议.Websocket协议是全双工的.基于数据帧的.建立在tcp之上的长连接协议.Webso ...
- JavaScript之从浏览器一键获取教务处个人课程信息【插件】
由于博主的个人网站(:http://www.johnnyzen.cn/),每学期都需要更新呈现课程的静态信息,由于课程量多,而且手动爬取很冗杂,特别想自动化实现.这不,今天终于有点时间了,把之前写no ...
- Netty源码分析第6章(解码器)---->第1节: ByteToMessageDecoder
Netty源码分析第六章: 解码器 概述: 在我们上一个章节遗留过一个问题, 就是如果Server在读取客户端的数据的时候, 如果一次读取不完整, 就触发channelRead事件, 那么Netty是 ...
- Netty源码分析第6章(解码器)---->第4节: 分隔符解码器
Netty源码分析第六章: 解码器 第四节: 分隔符解码器 基于分隔符解码器DelimiterBasedFrameDecoder, 是按照指定分隔符进行解码的解码器, 通过分隔符, 可以将二进制流拆分 ...
随机推荐
- C# 模拟POST提交文件
http://blog.csdn.net/hellowjwang/article/details/19975635 public class HttpPost { /// <summary> ...
- 判断浏览器类型-----------navigator.userAgent.indexOf()
<script language="JavaScript"> <!-- function getOs() { var OsObject = "" ...
- 树莓派raspbian安装配置(基本配置+中文配置+远程桌面+lighttpd+php+mysql)
raspbian为树莓派的官方系统,基于Debian裁剪过的Linux系统 其配置过程如下 烧录镜像 首先从树莓派的官方网站上下载镜像和镜像工具 http://www.raspberrypi.org/ ...
- 学习Java Web开发
学习DreamWaveMX中文版的网页设计技术 HTML网页设计,这是最基本的.学习XML的一些基本知识.初步掌握一些JSCRIPT的应用. 学习JAVA语言. 这应该分成2次来进行: 第1次找一本国 ...
- [转载]Java的内存回收机制
转自:http://www.admin10000.com/document/1671.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由J ...
- 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 ...
- mac osx 升级yosemite后java出错的解决
原文 http://www.cnblogs.com/walkerwang/p/4034152.html
- ExtJs双ActionResult共用同一Js文件ID冲突解决方案
项目使用MVC+ExtJs实现,权限控制是基于Controller下的ActionResult的,有一个页面因参数不同就需要新建两个ActionResult. 不要问我为何是基于页面级,而不是数据级, ...
- SharePoint 2010 使用自定义aspx页面替换列表默认的新建(NewForm.aspx),查看(DispForm.aspx)和编辑(EditForm.aspx)页面
转:http://www.cnblogs.com/sygwin/archive/2011/11/04/2236678.html 如何使用自定义的aspx页(比如Application Page)替换列 ...
- NopCommerce架构分析之四----插件机制
NopCommerce支持灵活的插件机制,所谓Web系统插件,其实也就是可以像原系统的一部分一样使用. Web系统的使用方式就是客户端发送一个请求,服务端进行解析.在asp.net MVC中对客户请求 ...