C++进阶知识复习 1~15

C++ 进阶总复习 (1~15)

    • 目的
      • 1. 介绍下程序从编写到可执行的整个过程
      • 2. C++中的auto和decltype的区别
      • 3. 介绍下多态的实现原理
      • 4. C++中的new[] 和delete[] 为什么一定要配对使用?
      • 5. C++中malloc申请的内存 可以使用delete释放嘛
      • 6. 什么情况下会出现内存泄漏
      • 7. C++ String内部是使用堆内存还是栈内存
      • 8. 平时开发C++程序的时候错误码使用的多还是异常使用的多
      • 9. C++中如何进行性能优化
      • 10. 模板的实现一定要放在头文件中嘛?
      • 11. 什么场景下使用继承 什么场景下使用组合
      • 12. 什么情况下会出现死锁 如何避免
      • 13. 如何实现线程池 给出大致思路
      • 14. C++针对返回值进行的优化
      • 15. C++中动静态库的区别

目的

写这一系列文章的目的主要是为了秋招时候应对计算机基础问题能够流畅的回答出来 (如果不整理下 磕磕绊绊的回答会被认为是不熟悉)

本文章题目的主要来源来自于 面试鸭
部分面试鸭上没有而牛客网上有的博主会进行查缺补漏

题目编号按照面试鸭官网题号方便大家寻找

题解大部分是博主根据自己之前的博客再加上部分网上的内容进行口语化的表述 如果涉及到省略的部分博主会提供自己或者其他人的博客链接

1. 介绍下程序从编写到可执行的整个过程

参考博客

预处理相关知识


程序从编写到可执行分为下面几个过程

预处理 编译 汇编 链接

首先是预处理阶段 在这个阶段的时候程序会展开头文件 宏替换 去注释等操作

到了编译阶段 这个阶段最大的作用就是进行语法词法分析 并对程序进行优化 看看有没有什么错误的代码 之后转化为汇编语言

汇编阶段则是将汇编语言转化为二进制语言

链接阶段则会生成一个可执行程序 它会合并段表 符号表合并和重定位

2. C++中的auto和decltype的区别


auto关键字用于自动推导变量的类型

而decltype关键字用于推导表达式的类型 它会返回表达式对应的类型信息而不进行计算

decltype关键字在模板编程的时候十分好用


3. 介绍下多态的实现原理

参考博客

多态原理


这里多态主要包括两点 一个是静态多态 一个是动态多态

静态多态的话 它的原理就是函数重载嘛 我们都知道在C语言链接阶段的时候是通过函数名来标记一个函数的(参数不论) 但是C++的话 参数的个数 顺序 类型都会影响函数标记 所以说这就是它的底层原理

然后动态多态的话就是通过虚指针和虚表来实现的嘛

如果说我们的类中有一个虚函数 那么实例化对象的时候 这个对象的大小就会多出四个字节 实际上就是多出一个指针的大小 这个指针就是虚指针

然后这个指针会指向一张表 我们把这张表叫做虚表每个类的虚表都不同 所以说自然会产生不同的函数效果

4. C++中的new[] 和delete[] 为什么一定要配对使用?


因为如果不这样做可能会造成内存泄漏的情况

我们一般来说是建议new[] 和 delete[] 配对使用的 但是说也有特殊情况

比如说如果我们new []了内置类型的话 我们使用delete删除就不会造成内存泄漏的情况

如果是自定义类型的话 就会造成这种情况


为什么自定义类型会造成而内置类型不会造成呢? 这里可以推断一下 可能是因为内置类型重载了opeartor new 和opeartor delete

5. C++中malloc申请的内存 可以使用delete释放嘛


不可以 malloc申请的内容应该使用free释放

虽然说delete底层是调用free函数 但是delete还做了更多的事情

它首先会调用析构函数 之后才会释放内存

如果说直接使用delete的话很可能会出现未定义行为 甚至报错

6. 什么情况下会出现内存泄漏

参考博客

内存泄漏


其实很多情况下都会出现内存泄漏

比如说指针原本指向一块分配好的内存 但是指针丢失了

比如说循环引用

比如说创建对象之后没有释放

那么如何解决呢?

当然也有很多种方法解决

我们可以使用内存泄漏检测工具 valgrind

然后使用RAII思想去检测

有一个良好的代码编程习惯等等

7. C++ String内部是使用堆内存还是栈内存

参考博客

string的模拟实现


模拟实现过string之后就会知道 string的底层其实维护了一个指针 这个指向会指向堆上开辟的空间

所以说string内部使用的是堆内存

8. 平时开发C++程序的时候错误码使用的多还是异常使用的多


错误码使用的比较多

因为错误码相对于异常来说

  1. 性能开销更小
  2. 更适合处理复杂的流程 能够只管的反应错误信息

但是错误码也有缺点

就是我们写需求的时候 每次写新的需求 大概率就要写新的错误码 就会造成代码臃肿 如果不注释 就很难知道错误码表示什么信息 可能出现意料之外的错误

9. C++中如何进行性能优化


这个可以从很多点上去回答

从代码编写的角度来说

  1. 选取合适的数据结构 比如说在频繁查询的场景下使用哈希表来存储数据
  2. 选择合适的算法 优化算法的时空复杂度
  3. 使用RAII思想 使用对象管理资源 避免资源泄漏

从架构层面上来说

根据需求来设计合适的架构 比如redis和mysql的冷热数据分离

10. 模板的实现一定要放在头文件中嘛?

参考博客

模板的编译分离


我们一般来说是简历将模板和生命和定义放在一起的

但是也不是没有办法比如说我们可以显示的实例化

这样子链接的时候就不会报错了

11. 什么场景下使用继承 什么场景下使用组合


我们在is a的关系下使用继承

在has a的关系下使用组合

就比如说人类和学生的关系 学生是人类 所以说这个时候我们推荐使用继承

比如说轮胎和汽车的关系 轮胎是汽车的一部分 所以说这个时候我们推荐使用组合

12. 什么情况下会出现死锁 如何避免

参考博客


多线程


这里其实是考察死锁的四个必要条件

  1. 互斥 一个资源每次只能被一个执行流使用
  2. 请求与保持 一个执行流因请求资源而阻塞时 对已获得的资源保持不放
  3. 不剥夺 一个执行流已获得的资源 在未使用完之前 不能强行剥夺
  4. 循环等待 若干执行流之间形成一种头尾相接的循环等待资源的关系

至于如何避免死锁就很简单了 我们只需要破坏死锁的四个必要条件即可

13. 如何实现线程池 给出大致思路

这里具体参考我的这篇博客

线程池

这个问题是个很宏大的问题 能够引出很多小问题 可以把上面那篇博客吃透之后再去回答

14. C++针对返回值进行的优化


在返回一个临时对象的时候 如果按照一般的方式 可能要经历

析构函数 拷贝构造

而C++优化可能会直接在返回值位置构建一个对象 这就是C++针对返回值的优化

15. C++中动静态库的区别

参考博客

动态库和静态库


动静态库的本质其实都是半成品程序 也就是说.o文件 也可以说是二进制文件嘛

静态库的话其实就是在程序链接的时候将这个.o文件打包到程序里面嘛

动态库的话是程序运行的时候将动态库加载到共享区去

他们之前的区别主要是 静态库打包到程序里面 它就不需要依赖外部文件了嘛 但是有利有弊就会造成程序的膨胀

动态库就是相反嘛 节省磁盘空间 减少冗余代码 但是说如果缺少了库文件就无法运行

打个比方的话就是 将库文件比作电脑嘛

静态库就是电脑放在宿舍里面 随时都能玩 但是占用空间

动态库就是电脑放在网吧 想玩要去网吧玩 但是占用空间小

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

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

相关文章

输电线路航空标志球:低空飞行的安全路标 / 恒峰智慧科技

在现代社会,随着航空业的快速发展,低空飞行活动日益频繁。为了确保飞行安全,避免飞机与高压电线等障碍物发生碰撞,输电线路航空标志球应运而生。这种装置被广泛应用于高压输电线路上,尤其是超高压和跨江输电线&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件详解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件详解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件详解 在 Debian/Ubuntu 系统中,/etc/network/interfaces 是传统网络接口配置文件,用于定义网络接口的静态/动态配置。以下是逐项解…

OpenCV 图形API(或称G-API)(1)

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 引言 OpenCV 图形API(或称G-API)是一个新的OpenCV模块,旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解题思路2. 代码实现 题目链接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解题思路 这一题大的思路上不难想到就是一个动态规划的思路。我们分别…

win10之mysql server 8.0.41安装

一 mysql server 下载 官网下载地址页面 https://dev.mysql.com/downloads/mysql/二 免装版使用步骤 1 解压 下载完成后,解压文件夹,如下所示: 2 执行安装命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二届蓝桥杯省赛软件类(cc++组)

第一题&#xff08;空间&#xff09; 解题思路 答案 #include <stdio.h>int main() {// 计算256MB对应的字节数&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每个32位二进制整数占4个字节&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移动语义

文章目录 一、移动语义1、为什么需要移动语义&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何实现移动语义&#xff1f;——移动构造函数/赋值4、什么时候触发移动&#xff1f;5、移动 vs 拷贝 一、移动语义 1、为什么需要移动语…

wsl下ubuntu安装宝塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安装宝塔面板的步骤如下&#xff1a; 1. 确保 WSL 环境正常 已安装 WSL 2 并启用 Ubuntu 发行版&#xff08;推荐 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中检查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP网络通信

UDP网络通信&#xff1a; 步骤1 创建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);参数一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA节点探测是干什么用的?

想象一个大城市被划分成几个区&#xff08;比如东区、西区&#xff09;。每个区有自己的超市&#xff08;内存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本区的超市买东西最快&#xff0c;去其他区的超市会慢一些。 NUMA节点探测&#xff0c;就是Linux系统在…

使用 Less 实现 PC 和移动端样式适配

&#x1f310; 使用 Less 实现 PC 和移动端样式适配 —— 以 position 属性为例 在前端开发中&#xff0c;我们常常会遇到这样一个场景&#xff1a; 在 PC 页面中需要某个元素是 position: relative;&#xff0c;但在移动端却希望它是 position: inherit;&#xff0c;以便更灵…

企业战略管理(设计与工程师类)-2-战略规划及管理过程-1-概述

战略管理过程 参考资料&#xff1a; 战略管理 - 清华大学- 蔡临宁公司战略与风险管理 - 华中科技大学 - 贺远琼战略管理 - 北京理工大学 - 杨万荣DeepSeek - 深度思考与联网检索 AFI框架 战略管理最典型的就是采用传统的AFI通用战略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发&#xff0c;但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析&#xff1a; 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…

【教程】如何利用bbbrisk一步一步实现评分卡

利用bbbrisk一步一步实现评分卡 一、什么是评分卡1.1.什么是评分卡1.2.评分卡有哪些 二、评分卡怎么弄出来的2.1.如何制作评分卡2.2.制作评分卡的流程 三、变量的分箱3.1.数据介绍3.2.变量自动分箱3.3.变量的筛选 四、构建评分卡4.1.评分卡实现代码4.2.评分卡表4.3.阈值表与分数…

AI日报 - 2025年4月2日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL训练可诱发模型顿悟&#xff0c;Anthropic发布Claude 3.5内部机制研究&#xff0c;简化语言模型推理优化新方法提出。 DeepSeek-R1无需额外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 网络穿透:如何从外部访问 K8s Pod 地址

文章目录 探索 Kubernetes 网络穿透&#xff1a;如何从外部访问 K8s Pod 地址为什么需要外部访问 Pod 地址&#xff1f;常见的网络穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;为开发调试提供便捷穿透 实践建议与注意事项各方案对比表总…

深入理解 Apache Dagster:数据管道编排实战指南

本文系统介绍了 Apache Dagster 的核心概念与实践方法&#xff0c;涵盖环境搭建、管道定义、运行调试及高级功能&#xff0c;帮助开发者快速掌握这一现代化数据编排工具&#xff0c;提升数据工程效率。 1. 背景与核心优势 随着数据驱动应用的复杂化&#xff0c;传统工具在可维…

Minio集群部署

Minio集群部署 资源规划 IP服务规划配置192.168.116.138minio-116核32G磁盘10T192.168.116.139minio-216核32G磁盘10T192.168.116.140minio-316核32G磁盘10T192.168.116.141minio-416核32G磁盘10T192.168.116.128nginx代理8核16G磁盘500G 基本环境配置 下面命令minio4台设备…

操作系统高频(六)linux内核

操作系统高频&#xff08;六&#xff09;linux内核 1.内核态&#xff0c;用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限&#xff1a;内核态拥有最高的权限&#xff0c;可以访问和执行所有的系统指令和资源&#xff0c;而用户态的权限相对较低&#x…

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具&#xff1a;程序员的得力助手 在当今的软件开发世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已经成为了数据交换的通用语言。无论是前端还是后端开发&#xff0c;我们都经常需要处理、验证和转换JSON数据。今天&a…