【C++】计算类的大小

news2024/10/6 8:22:39

目录

  • 简介
  • 计算类的大小
    • 场景1:空类
    • 场景2
    • 场景3:含有虚函数
    • 场景4:继承
    • 场景5:存在字节对齐的情况
  • 总结
  • 结语

在这里插入图片描述

简介

Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
 
唯有努力💪
 
本文仅记录自己感兴趣的内容

计算类的大小

场景1:空类

#include <bits/stdc++.h>
using namespace std;
class A
{

};
int main()
{
    int m;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    return 0;
}

在这里插入图片描述

场景2

#include <bits/stdc++.h>
using namespace std;
class A
{
public:
    int a;
    int b;

public:
    void print()
    {
        cout << "I am haihong." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl; // 1个int 大小为4
    cout << "sizeof(A) = " << sizeof(A) << endl;   // 类A的大小为8 = 4 + 4,因为有两个int,函数print并没有占空间
    A a;
    cout << "sizeof(a) = " << sizeof(a) << endl;
    return 0;
}

在这里插入图片描述

场景3:含有虚函数

#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print() {
        cout << "I am haihong." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    return 0;
}

在这里插入图片描述

注:

  • 虚函数那里有一个指针,指向虚函数表,所以此时类大小含有一个指针
  • 在32位系统,一个指针4字节;64位系统,一个指针8字节

那么两个虚函数呢?

测试:

#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print(){};
    virtual void test(){};
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}

结果还是一个指针的大小

在这里插入图片描述
原因:当类含有虚函数时,存在一个指针指向一个虚函数表,这个虚函数表可以有多个虚函数,但是指针只需要一个来指向这个表即可

场景4:继承

#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print() {
        cout << "I am haihong." << endl;
    }
};
class B : public A {
    void print() {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}

在这里插入图片描述

注:

  • 在继承后,子类也是含有一个指针,指向虚函数表

场景5:存在字节对齐的情况

#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print()
    {
        cout << "I am haihong." << endl;
    }
    int a;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;// 4
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;// 16
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;// 16
    return 0;
}

在这里插入图片描述

这里class A有一个指针(指向虚函数表),还有1个int类型

开始以为A大小为8+4 = 12

后面运行发现为16

然后又测试A中含有两个int类型时

#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print()
    {
        cout << "I am haihong." << endl;
    }
    int a;
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;// 4
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;// 16
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;// 16
    return 0;
}

发现结果也是16

在这里插入图片描述

琢磨了一会才反映过来,class与struct差不多,存在内存对齐,这样就好理解了

内存对齐具体概念请自行查阅

注:

  • 考虑类大小时,还要考虑内存对齐

后面又测试:虚表指针的位置对类大小有影响吗

#include <bits/stdc++.h>
using namespace std;
class A
{
	//顺序: int ptr int
    int a;
    virtual void print()
    {
        cout << "I am haihong." << endl;
    }
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}

发现结果无影响

在这里插入图片描述


继续测试:除了虚表指针外,其他类型顺序对大小有变化吗

分别是

    char c1;
    int a;
    char c2;
    int b;
    char c1;
    char c2;
    int a;
    int b;

测试代码1:

#include <bits/stdc++.h>
using namespace std;
class A
{
    char c1;
    int a;
    char c2;
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}

在这里插入图片描述
测试代码2:

#include <bits/stdc++.h>
using namespace std;
class A
{
    char c1;
    char c2;
    int a;
    // char c2;
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}

在这里插入图片描述

发现是有影响的,具体与struct内存计算是一样的(自行查阅)

总结

计算类大小时,需要考虑

  • 是否存在虚函数,有则说明存在一个指针指向虚函数表
  • 子类继承父类,父类含有虚函数时,子类其实也是有指向虚表的指针的
  • 还要考虑内存对齐的情况(顺序是有关的,这里虚表指针顺序则无影响)

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多媒体子系统02:V4L2核心框架分析(部分)

目录 1 V4L2框架结构概述 1.1 imx8视频输入通路硬件结构 1.2 V4L2设备节点观察 1.3 dts配置观察 1.4 probe函数观察 1.4.1 函数功能简介 1.4.2 各模块probe函数分析 1.5 V4L2框架结构图示 2 设备管理机制 2.1 v4l2_device结构体相关 2.1.1 v4l2_device结构体 2.1.2…

15.Java多线程

目录 1. Java基本介绍 2. JDK下载安装及其环境配置 3. 一个简单的java程序 4. Eclipse基本使用、数据类型、运算符 5. 控制语句&#xff08;if、switch、for、while、foreach&#xff09; 6. Java数组 7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner…

教你如何免费使用ChatGPT 4?(国内可以直接访问,不用魔法)

目录 一. 内容介绍 二. 功能介绍 三. 优势 四. 版本比较 五. 国内试用方法 内容介绍&#xff1a; ChatGPT 4是由OpenAI开发的最新一代大型语言模型&#xff0c;其采用了GPT-3.5的技术架构&#xff0c;是目前全球最强大的通用AI模型之一。ChatGPT 4拥有极高的语言处理能力和…

SD卡恢复怎么做?内存卡数据恢复,3个方法!

案例&#xff1a;sd卡怎么恢复&#xff1f; 【我的sd卡用了快一年了&#xff0c;里面存储了很多非常重要的文件&#xff0c;但不知道为什么我今天将它插入电脑后&#xff0c;很多文件都无法显示了&#xff0c;大家有什么好的方法可以恢复sd卡吗&#xff1f;感谢回答&#xff0…

【翻译一下官方文档】之uniapp的导航条设置

目录 uni.setNavigationBarTitle(OBJECT) uni.setNavigationBarColor(OBJECT) uni.hideHomeButton(OBJECT) uni.setNavigationBarTitle(OBJECT) 动态设置当前页面的标题。 OBJECT参数说明 参数类型必填说明titleString是页面标题successFunction否接口调用成功的回调函数fai…

安虚拟机详细教程 VMware虚拟机与主机之间不能复制粘贴及拖拽问题

VMware虚拟机中安装Ubuntu18.04&#xff08;linux发行版&#xff09;【超详细图文教程】_vmware安装ubuntu18.04__7270的博客-CSDN博客 1. 查看vmware Tools是否安装 打开虚拟机 &#xff0c;点击上方导航栏 ‘虚拟机’ 查看VMware Tools是否安装&#xff0c;如果未安装&#…

Linux和shell命令第一节课

windows开发 linux服务 区块链&#xff0c; 稳定&#xff0c;安全&#xff0c;可移植性&#xff0c;低资源消耗&#xff0c;开源软件---windows付费 linux就是操作系统&#xff0c;网络服务&#xff0c;移动设备&#xff0c;嵌入式系统&#xff0c;计算器服务器 除个人桌面…

Sentinel:服务限流

文章目录 创建工程测试工程流控熔断热点授权规则系统规则SentinelResource 配置持久化执行流程 创建工程测试工程 1.导入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><v…

开放原子训练营第三期:RT-Thread 学习有感

介绍 前几天有幸收到C站的训练营学习邀请&#xff0c;了解到这两天即将举行的开放原子 RTT 训练营。博主算是一名嵌入式方向的小白&#xff0c;主要还是在裸机上进行开发&#xff0c;但对嵌入式的操作系统和实时系统很感兴趣。在这次学习训练营中借助一些学习示例&#xff0c;…

【Linux】 1.2基本指令-part 2

文章目录 07. man指令08.cp指令(copy)&#xff08;重要&#xff09;09.mv指令(move)&#xff08;重要&#xff09;10.cat指令- 补充&#xff1a;echo 与 >11.more指令12.less指令&#xff08;重要&#xff09;13.head指令14.tail指令- 补充&#xff1a;管道 07. man指令 ma…

CV不存在了?体验用Segment Anything Meta分割清明上河图

目录 1 Facebook抠图神器2 本地版SAM配置3 Web版SAM体验4 总结 1 Facebook抠图神器 在图像处理与计算机视觉领域&#xff0c;图像分割(image segmentation)是在像素级别将一个完整图像划分为若干具有特定语义区域(region)或对象(object)的过程。每个分割区域是一系列拥有相似特…

IJKPLAYER源码分析-常用API

前言 本文简要介绍IJKPLAYER的几个常用API&#xff0c;以API使用的角度&#xff0c;来审视其内部运作原理。这里以iOS端直播API调用切入。 调用流程 init 创建播放器实例后&#xff0c;会先调用init方法进行初始化&#xff1a; - (IJKFFMediaPlayer *)init {self [super ini…

《深入浅出Embedding》随笔

ChatGPT的核心运行机制或许是Transformer&#xff0c; ChatGPT的核心数据机制或许就是嵌入&#xff08;Embedding&#xff09;了。什么是Embedding呢&#xff1f;了解Embedding可以为我们的软件研发工作带来哪些帮助呢&#xff1f;鉴于此&#xff0c;老码农阅读了《深入浅出Emb…

前端切图仔入门Docker,三分钟上线自己的博客平台

依稀记得2022年趁某平台优惠买了台云服务器&#xff0c;周未准备安装MySQL数据库&#xff0c;两天时间卡在MySQL环境配置上&#xff0c;实在是折磨一气之下把服务器给退了。 要是我早一点学会Docker&#xff0c;我的博客估计已上线一年啦&#xff01;前端切图仔学会Docker&…

AI魔法秀:D-ID助你打造视频虚拟数字人

随着ChatGPT的各种玩法&#xff0c;写文章、做PPT、编程、修bug等&#xff0c;大家都玩的不亦说乎&#xff0c;可以说真的给家人们提升的效率很高&#xff0c;最近个人尝试着制作一个虚拟数字人&#xff0c;也是一个玩法&#xff0c;可以帮助很多中小企业做企业文化宣讲或者是产…

闲谈【Stable-Diffusion WEBUI】的插件:美不美?交给AI打分

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;咖啡店艺术评价&#xff08;Cafe Aesthetic&#xff09; &#xff08;零&#xff09;前言 本篇主要提到了WEBUI的Cafe Aesthetic插件&#xff0c;这是一个相对独立的插件&#xff0c;单独标签页&#xff0c;…

周杰伦代言的蕉下,3年半广告宣传费超10亿,全靠营销?

五一假期将至&#xff0c;各地即将迎来旅游小热潮&#xff0c;不少游客也开始为自己的出行准备攻略。随着露营、徒步等城市户外运动的兴起&#xff0c;防晒理念“再度升温”&#xff0c;靠卖小黑伞起家的蕉下瞄准年轻世代消费者&#xff0c;又在疯狂收割“防晒焦虑”。 去年4月…

【JavaWeb】JavaScript

1、JavaScript 介绍 Javascript 语言诞生主要是完成页面的数据验证。因此它运行在客户端&#xff0c;需要运行浏览器来解析执行 JavaScript 代码。 JS 是 Netscape 网景公司的产品&#xff0c;最早取名为 LiveScript;为了吸引更多 java 程序员。更名为 JavaScript。 JS 是弱…

排序 - 冒泡排序(Bubble Sort)

文章目录 冒泡排序介绍冒泡排序实现复杂度和稳定性冒泡排序时间复杂度冒泡排序稳定性 代码实现核心&注意结尾 每日一道算法提高脑力&#xff0c;今天是第一天&#xff0c;来个最简单的算法–冒泡排序。 冒泡排序介绍 它是一种较简单的排序算法。它会遍历若干次要排序的数列…

对话庄表伟老师-文字实录

我内心有一套价值观&#xff0c;有一套世界观&#xff0c;它是一个完整的整体&#xff0c;无论我做任何的事情&#xff0c;工作也好、生活也好、学习也好、去做社区也好、或者是结识朋友也好、去聊天也好&#xff0c;背后的价值观在内心都是一整套的&#xff0c;互相之间是不会…