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;
};

我们输出这两个类的长度

 1 #include <stdio.h>
 2 class A{
 3 public:
 4     void func1(void){
 5         printf("11111heihei\n");
 6     };
 7     void func2(void){
 8         printf("11111heihei\n");
 9     };
10 public:
11     int number;
12 };
13 class B{
14 public:
15     void func1(void){
16         printf("heihei\n");
17     };
18     void func2(void){
19         printf("heihei\n");
20     };
21 public:
22     char number;
23     int number1;
24 };
25 int main(){
26     printf("A %d B %d\n",sizeof(A),sizeof(B));
27     getchar();
28      return 0;
29 }

得到结果:

  至于为什么第二个是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;
};

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

 1 #include <stdio.h>
 2 class A{
 3 public:
 4     virtual void func1(void){
 5         printf("11111heihei\n");
 6     };
 7     void func2(void){
 8         printf("11111heihei\n");
 9     };
10 public:
11     int number;
12 };
13 class B{
14 public:
15     virtual void func1(void){
16         printf("heihei\n");
17     };
18     virtual void func2(void){
19         printf("heihei\n");
20     };
21 public:
22     int number1;
23 };
24 int main(){
25     printf("A %d B %d\n",sizeof(A),sizeof(B));
26     getchar();
27      return 0;
28 }

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

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

c++中类长度解析

时间: 2024-11-05 17:29:34

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

通过NSXMLParser来解析XML

NSXMLParser 使用 delegate 模型来解析 XML 内容的.下面我们来创建一个 XML 文 件,文件中包含如下内容(在工程中保存为 MyXML.xml): <?xml version="1.0" encoding="UTF-8"?> <root> <person id="1"> <firstName>zhang</firstName> <lastName>sa

多媒体开发之h264中的sps---sps信息提取之分辨率宽高提取2

-------------------author:pkf -----------------------------time:2015-8-20 ---------------------------------------------qq:1327706646 (1) sps 数据结构 (2) 指数哥伦布码(Exponential-Golomb code, 即Exp-Golomb code) (3) 宽高计算 (4) 代码实现 --------------------------------

HTML5牛刀小试

第一周的HTML5苦逼之路,就这么简单,充实,忙碌的开始了,丝毫不敢有一丢丢懈怠,压力是有的,但更多的是对自己的信心,更是对自己的踏上苦逼之路的意志的肯定. 简单回顾了下这周所学内容.从认识HTML基本结构,到制作简单表单,就是这么,下面我简单记录和整理下这周的笔记吧!! 这是这周我所做的一个简单表单,low是low了点,毕竟每个人都开始都不会一帆风顺,当然,我也是?(? ???ω??? ?)?. <!DOCTYPE html><html> <head> <met

浅谈指针

指针:一个用来存储数据存储地址的变量. int a=10;  a变量里面存储的数据0 1按照int 的长度解析为数据 int *p=&a; p变量里面存储的数据0 1解析为地址,只是这个地址(这个地址是这段空间的首地址)标号的那段空间里面存储的是a的值,这里的p是给这段地址的取的名字用来给程序员看的,这里的a是给这段地址里面存储内容所取得名字来给程序员看的.

Netty源码分析第6章(解码器)----&gt;第1节: ByteToMessageDecoder

Netty源码分析第六章: 解码器 概述: 在我们上一个章节遗留过一个问题, 就是如果Server在读取客户端的数据的时候, 如果一次读取不完整, 就触发channelRead事件, 那么Netty是如何处理这类问题的, 在这一章中, 会对此做详细剖析 之前的章节我们学习过pipeline, 事件在pipeline中传递, handler可以将事件截取并对其处理, 而之后剖析的编解码器, 其实就是一个handler, 截取byteBuf中的字节, 然后组建成业务需要的数据进行继续传播 编码器,

Netty解码的艺术

什么是拆包/粘包: TCP 粘包/拆包: TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP 作为传输层协议并不了解上层业务数据的具体含义,它会根据TCP 缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP 粘包和拆包问题.同样, 在Netty 的编码器中, 也会对半包和粘包问题做相应的处理.什么是半包, 顾名思义, 就是不完整的数据包, 因为netty 在

Sharding-Proxy 源码分析

目录 Sharding-Proxy 源码分析 Sharding-Proxy 包结构 Sharding-Proxy 启动流程 Sharding-Proxy 请求接入 MySQL 报文解析器 MySQL 执行器 MySQLComQueryPacketExecutor 执行流程 MySQLComStmtExecuteExecutor 执行流程 Sharding-Proxy 消息处理 Sharding-Proxy 源码分析 在看 Sharding-Proxy 源码之前,强烈建议先阅读一直官网的两篇文章:

hash哈希长度扩展攻击解析(记录一下,保证不忘)

起因 这是 ISCC 上的一道题目,抄 PCTF 的,并且给予了简化.在利用简化过的方式通过后,突然想起利用哈希长度扩展攻击来进行通关.哈希长度扩展攻击是一个很有意思的东西,利用了 md5.sha1 等加密算法的缺陷,可以在不知道原始密钥的情况下来进行计算出一个对应的 hash 值. 这里是 ISCC 中题目中的 admin.php 的算法: $auth = false; if (isset($_COOKIE["auth"])) { $auth = unserialize($_COOK

django模板解析 循环列表中 切片和求长度

{% for subrow in subdic.content|slice:":5" %} {% endfor %} {% if "{{subdic.content|length}}" > 5 %} {% endif %} 如上,关键在于 循环中,里面的列表外面没有双引号 而if中,列表外面有双引号 网上很多文章太坑..