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, 是按照指定分隔符进行解码的解码器, 通过分隔符, 可以将二进制流拆分 ...
随机推荐
- CentOS5.5上安装git
1.尝试用yum安装git失败 [root@localhost usr]# yum install gitLoaded plugins: fastestmirrorLoading mirror spe ...
- win设置壁纸
默认壁纸图片位置: C:\Windows\Web\Wallpaper\Scenes 你可以自己建文件夹,放自己喜欢的桌面壁纸. 设置壁纸: 桌面右键 -> 个性化 然后点击 “桌面背景” - ...
- 8.11-8.16:usaco
summary:57 bzoj1741:裸二分图最大匹配 #include<cstdio> #include<cstring> #include<iostream> ...
- BZOJ2140: 稳定婚姻
题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...
- HNOI2008Cards
看了一下polya和burnside定理,感觉还行(就是不会证……) 这题用的是burnside ans=在每个置换群下不动的方案数之和除以置换数 这题有个难点在取模 关于对p(p为素数)取模(涉及到 ...
- NOI2005维修数列
剧恶心的splay…… 为什么在bzoj上是超时,在自己的电脑上测的是栈溢出…… ; maxc=; var n,m,i,j,y,root,x,posi,t,head:longint; ch:char; ...
- 将archlinux 2013-06-01版,安装配置为个人工作站
本文安装所使用的镜像为:archlinux-2013.06.01-dual.iso.首先请看看我安装完成之后的效果.图一,是第一个虚拟桌面及右键菜单图: 图二,是第二个虚拟桌面效果图.后几个虚拟桌面图 ...
- POJ 3436 ACM Computer Factory (拆点+输出解)
[题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...
- auto make System.map to C header file
#!/bin/bash # auto make System.map to C header file # 说明: # 该脚本主要是将Linux内核生成的System.map文件中的符号.地址存入结构 ...
- 【译】 AWK教程指南 6在AWK程序中使用Shell命令
awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...