C++之《剑指offer》学习记录(2):sizeof
笔者最近在找工作时,无意间读到了一本名为《剑指offer》的书,粗略翻阅了一下,感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程,希望能和这本书的读者朋友们一起交流学习心得。
介绍:《剑指Offer:名企面试官精讲典型编程题(第2版)》剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。
编程题链接:牛客网在线编程_算法面试_面试必刷TOP101 (nowcoder.com)
本博客关键词:sizeof
介绍
- 在C/C++中,
sizeof是一个关键字,也是一个运算符,用来获取类型或对象在内存中所占的字节大小。 sizeof不是函数,在代码的编译阶段就会执行。sizeof计算内存占用大小的应用场景:基本数据类型、数组、结构体、类、指针、枚举、联合体等。
引入
先阅读一下代码,预测下cout对应的输出都会是什么?(假设代码在64位机器上运行)
#include <iostream>using namespace std;// 空类型
class MyClass1
{
};// 添加了构造函数和析构函数的空类型
class MyClass2
{MyClass2();~MyClass2();
};// 析构函数为虚函数的空类型
class MyClass3
{MyClass3();virtual ~MyClass3();
};int main(int argc, char const *argv[])
{char str1[10] = "hello";const char *str2 = "hello world";int num1[10];int *num2 = new int[10];cout << sizeof(int) << endl;cout << sizeof(double) << endl;cout << sizeof(long) << endl;cout << sizeof(str1) << endl;cout << sizeof(str2) << endl;cout << sizeof(num1) << endl;cout << sizeof(num2) << endl;cout << sizeof(NULL) << endl;cout << sizeof(MyClass1) << endl;cout << sizeof(MyClass2) << endl;cout << sizeof(MyClass3) << endl;return 0;
}
结果如下:
cout << sizeof(int) << endl; // 4cout << sizeof(double) << endl; // 8cout << sizeof(long) << endl; // 8cout << sizeof(str1) << endl; // 10cout << sizeof(str2) << endl; // 8cout << sizeof(num1) << endl; // 40cout << sizeof(num2) << endl; // 8cout << sizeof(nullptr) << endl; // 8cout << sizeof(MyClass1) << endl; // 1cout << sizeof(MyClass2) << endl; // 1cout << sizeof(MyClass3) << endl; // 8
分析
sizeof(int)这个输出为4很好理解,int类型占用4个字节的内存。sizeof(double)输出为8,也很好理解,double类型占用8个字节的内存。sizeof(long)输出为8。在32位机器中,long占4个字节,在64位机器中long占8个字节。sizeof(str1)输出为10,str1对应了数组str1[10]。sizeof(str2)输出为8,str2对应一个指针。这里大家第一次看可能会有疑问,明明有”数组名称代表数组首元素地址“的说法,为什么sizeof(str1)和sizeof(str2)的输出结果不一样呢?我是这样理解的:首先str2在这里确实是一个指针,所以sizeof(str2)对应的值是8,这是很好理解的;但是对于数组str1[10],str1本质上只是数组名,它并不占用任何的内存,它代表的是数组,它可以表示数组首元素的地址,但实际上数组首元素的地址是str1[0]对应的地址,str1数组名不占用实际内存。当使用sizeof运算符通过数组名计算数组内存占用时,数组名表示的是整个数组,而不是某个地址。- 根据第5点的解释,很容易可以得出
sizeof(num1)的输出为40,sizeof(num2)的输出为8。 sizeof(nullptr)输出为8,关键字nullptr表示空指针。
接下来就是对
sizeof(MyClass)的分析,也是书里提到的一个案例。
- 提问:定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,结果是多少?
- 答案:空类型的示例中不包含任何信息,但是在声明该类型的实例时,必须在内存中有一定的空间,否则无法使用这些实例。至少占用多少字节的内存,由编译器决定,在GCC中,每个空类型的实例占用1字节。
- 提问:如果在空类型中加入一个构造函数和一个析构函数,再求sizeof,结果是多少?
- 答案:仍然是1,调用构造函数和析构函数只需要知道函数的地址即可,而函数的地址只与类型相关,编译器因为这两个函数而在实力内添加任何额外的信息。
- 提问:如果将析构函数标记为虚函数呢?
- 答案:在32位机器中输出为4,在64位机器中输出为8。因为C++编译器一旦发现类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。
空类型如下:
// 空类型
class MyClass1{};
加了构造函数和析构函数:函数内容也为空
// 添加了构造函数和析构函数的空类型
class MyClass2
{MyClass2();~MyClass2();
};
将析构函数标记为虚函数:
// 析构函数为虚函数的空类型
class MyClass3
{MyClass3();virtual ~MyClass3();
};
相关文章:
C++之《剑指offer》学习记录(2):sizeof
笔者最近在找工作时,无意间读到了一本名为《剑指offer》的书,粗略翻阅了一下,感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程,希望能和这本书的读者朋友们一起交流学习心得…...
linux线程 | 同步与互斥 | 线程池以及知识点补充
前言:本节内容是linux的线程的相关知识。本篇首先会实现一个简易的线程池, 然后再将线程池利用单例的懒汉模式改编一下。 然后再谈一些小的知识点,比如自旋锁, 读者写者问题等等。 那么, 现在开始我们的学习吧。 ps:本…...
ArkTS 如何实现表单,地区选择效果
速览 ArkTS实现表单和地区选择效果,可通过Picker组件实现地区选择下拉列表,结合表单组件如Input等构建完整表单。使用ArkTS提供的UI组件库和状态管理机制,可以方便地构建复杂且交云互动的表单界面。 1. ArkTS 表单基础 在ArkTS中,构建表单通常涉及多个UI组件的组合,如I…...
Vite 项目的核心配置- vite.config.ts 和 tsconfig.json 全解析
一、vite.config.ts 详细说明 vite.config.ts 是 Vite 项目的核心配置文件。它允许你自定义 Vite 的行为,以适应你的项目需求。 让我们来看看其中一些重要的配置选项: import { fileURLToPath, URL } from node:url// 使用 defineConfig 帮手函数,这样不用 jsdoc …...
如何使用JMeter进行性能测试的保姆级教程
性能测试是确保网站在用户访问高峰时保持稳定和快速响应的关键环节。作为初学者,选择合适的工具尤为重要。JMeter 是一个强大的开源性能测试工具,可以帮助我们轻松模拟多用户场景,测试网站的稳定性与性能。本教程将引导你通过一个简单的登录场…...
Qt 实战(11)样式表 | 11.1、样式表简介
文章目录 一、样式表简介1、简介2、样式表语法2.1、样式规则2.2、选择器类型2.3、伪状态2.4、设置子控件状态 3、样式表继承与优先级3.1、样式表继承3.2、样式表优先级3.3、解决冲突3.4、样式表层叠 4、总结 前言: 在开发图形用户界面(GUI)应…...
WebGl 多缓冲区和数据偏移
1.多缓冲区 多缓冲区技术通常涉及到创建多个缓冲区对象,并将它们用于不同的数据集。这种做法可以提高数据处理效率,尤其是在处理大量数据或需要频繁更新数据时。通过预先分配和配置多个缓冲区,可以在不影响渲染性能的情况下,快速…...
基于SSM的甜品店销售管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Spacetime Gaussian Feature Splatting for Real-Time Dynamic View Synthesis
Spacetime Gaussian Feature Splatting for Real-Time Dynamic View Synthesis 摘要 动态场景的新视角合成一直是一个引人入胜但充满挑战的问题。尽管最近取得了很多进展,但如何同时实现高分辨率的真实感渲染、实时渲染和紧凑的存储,依然是一个巨大的…...
PCL 基于FPFH特征描述子获取点云对应关系
目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 FPFH特征计算函数 2.1.2 获取点云之间的对应点对函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总…...
项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)
若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/143105881 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…...
OpenCV坐标系统与图像处理案例
在图像处理中,理解图像的坐标系统是至关重要的。OpenCV,作为一个强大的计算机视觉库,提供了丰富的功能来操作图像。本文将介绍OpenCV中的坐标系统,并提供一个简单的案例来展示如何使用这些坐标来修改图像的特定区域。 OpenCV坐标…...
Unity之如何使用Unity Cloud Build云构建
文章目录 前言什么是 UnityCloudBuild?如何使用Unity云构建Unity 团队中的人员不属于 Unity Team 的人员UnityCloudBuild2.0价格表如何使用Unity云构建配置CloudBuild前言 Unity Cloud Build作为Unity平台的一项强大工具,它允许开发团队通过云端自动构建项目,节省了繁琐的手…...
Halcon开启多线程
并行运算(提升检测时间) 支持主线程中的子线程并行执行程序和调用算子。 一旦启动,子线程由线程 ID 标识,该线程 ID 是一个取决于操作系统的整数进程号。 子线程的执行独立于它们启动的线程。 因此,无法预测子线程执行…...
Echarts 点击事件无法使用 this 或者 this绑定的数据无法获取
这里写自定义目录标题 现象解决方案 现象 给echarts绑定自定义点击事件时,无法使用this,并且无法获取到this绑定的数据。 解决方案 增加:const _this this; 代码块如下: const _this this; let myChart echarts.init(docum…...
PCL 基于距离阈值去除错误对应关系(永久免费版)
目录 一、概述1.1 原理1.2 实现步骤1.3应用场景 二、关键函数2.1 获取初始点对2.2 基于距离的对应关系筛选函数2.3 可视化 三、完整代码四、结果展示 即日起,付费专栏所有内容将以永久免费形式陆续进行发表!!! 一、概述 在3D点云的…...
DirectX 11 和 Direct3D 11 的关系
以下是对两者的详细比较: DirectX 11 DirectX 11是微软的一项技术,为高性能游戏和复杂图形程序制定了标准。它是DirectX系列的一个版本,引入了多项创新功能,如硬件加速的Tessellation(细分曲面技术)、多线…...
什么是SCRM?为什么企业要做SCRM?
很多人都知道CRM是客户关系管理系统,而SCRM又是什么呢? 今天我就给大家用一文讲清SCRM的那些事,本文包括:SCRM 的定义与内涵,与传统 CRM 的区别;通过案例阐述其重要性及作用,如适应消费模式转变…...
类间方差,分割地物
类间方差(Inter-class Variance)是用于图像分割中的一种统计量,特别是在使用Otsu方法进行阈值选择时。它衡量的是分割后两个类别(通常是前景和背景)之间的分离程度。类间方差越大,说明两个类别之间的差异越…...
基于微博评论的自然语言处理情感分析
目录 一、项目概述 二、需要解决的问题 三、数据预处理 1、词汇表构建(vocab_creat.py) 2、数据集加载(load_dataset.py) 四、模型构建(TextRNN.py) 1、嵌入层(Embedding Layerÿ…...
5个技巧掌握Obsidian Dataview:从静态笔记到动态知识库的蜕变
5个技巧掌握Obsidian Dataview:从静态笔记到动态知识库的蜕变 【免费下载链接】obsidian-dataview A data index and query language over Markdown files, for https://obsidian.md/. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-dataview Obsid…...
Mission Planner地面站保姆级教程:给Pixhawk刷固件、校准传感器到成功解锁起飞
Mission Planner地面站全流程实战:从固件刷写到安全起飞的终极指南 当第一次拿到Pixhawk飞控时,许多爱好者都会面临同样的困惑——如何将这块电路板变成可靠的飞行大脑?本文将用工程师视角拆解整个配置流程,分享那些官方手册没写清…...
在Windows上安装APK的终极指南:5步掌握APK Installer工具
在Windows上安装APK的终极指南:5步掌握APK Installer工具 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直接安装Android应用…...
HunterPie完全指南:如何在《怪物猎人世界》中获得实时数据监控优势
HunterPie完全指南:如何在《怪物猎人世界》中获得实时数据监控优势 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/…...
强化学习算法:深度确定性策略梯度(DDPG)
强化学习算法:深度确定性策略梯度(DDPG) 1. 技术分析 1.1 DDPG概述 DDPG是针对连续动作的深度强化学习算法: DDPG特点确定性策略: 输出确定动作而非概率Actor-Critic架构: 结合策略和价值离线策略: 使用经验回放核心创新:确定性策略梯度目标网络探索噪声…...
理发师会被 AI 取代吗?这可能是 AI 时代最有意思的一个社会学问题
今天去理发了。对着镜子,看着我的头发随着剪刀的飞舞一点点掉下来时,我忽然开始神游:AI 会不会取代理发师? 这问题乍一听有点像胡思乱想,可越想越觉得,它其实非常适合拿来当成 AI 时代的一块切片。 因为理发…...
收藏!小白程序员必看:读懂AI岗位JD,精准投递不陪跑
本文针对AI岗位认知模糊、JD理解困难等问题,为读者提供六步解析法,包括明确岗位性质、了解公司类型、评估薪资水平、硬性条件筛选、分析岗位职责和技能匹配。通过这些步骤,帮助读者精准定位适合自己的AI岗位,避免盲目投递。同时&a…...
Hanime1Plugin终极指南:打造纯净Android动漫观影体验的免费神器
Hanime1Plugin终极指南:打造纯净Android动漫观影体验的免费神器 【免费下载链接】Hanime1Plugin Android插件(https://hanime1.me) (NSFW) 项目地址: https://gitcode.com/gh_mirrors/ha/Hanime1Plugin 你是否厌倦了在Android设备上看动漫时被各种广告打断&a…...
如何让GBFR-Logs成为你的碧蓝幻想Relink战斗分析利器
如何让GBFR-Logs成为你的碧蓝幻想Relink战斗分析利器 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbfr-logs 你是否在《碧蓝幻…...
MASA模组全家桶汉化包:3329条专业翻译,彻底告别英文界面困扰
MASA模组全家桶汉化包:3329条专业翻译,彻底告别英文界面困扰 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Minecraft技术模组的英文界面而头疼吗&#x…...
