【c++面试总结】

1. NULL 和 nullptr 区别

int overLoadTest(int x) {cout << __LINE__ << endl;return 0;
}int overLoadTest(char* x) {cout << __LINE__ << endl;return 0;
}int main() {char x[10] = {1,2,3,4,5};overLoadTest(1);overLoadTest(x);overLoadTest(nullptr);// overLoadTest(NULL); // ambiguousreturn 0;
}

在这里插入图片描述

  • 结论:
    1. NULL 的定义 实际是 0;在重载函数中传入 NULL 具有二义性,编译器无法对 0 和 空指针类型区分
    1. nullptr 是c++11引入的安全的空指针字面量,不会被隐式转换为其他非指针类型,将去除二义性,可以安全的赋值给指针类型。

2. static 作用

  1. static 修饰变量或函数改变该变量的作用域和生命周期。使其仅在该文件中可见,有效隐藏了static变量,可以避免命名冲突、降低代码耦合度。
    static函数存储在代码段
    static变量存储在全局数据段
  2. 底层实现
    符号本地化:
    ` 编译:编译器生成的符号具有内部链接属性,只在当前编译单元可见
    · 链接:链接器不会将static符号输出到其他模块,也不会将其他模块同名函数输入。
    符号解析:
    · 链接器在链接阶段会解析符号引用,对于static符号,只会查找当前模块内的定义,不会从其他模块寻找。
    · 如果其他文件尝试引用static类型符号,链接器会报为解析符号引用,因为该符号不会出现在其他模块符号表中。

3. free()函数只传入一个地址,为什么知道释放空间大小

malloc分配的内存为一个个chunk,定义如下:

struct malloc_chunk {    size_t prev_size;  /* 前一个内存块的大小(如果合并的话) */    size_t size;       /* 当前内存块的大小,包括边界标记 */    struct malloc_chunk *fd;  /* 指向前一个空闲内存块的指针(用于空闲内存列表) */    struct malloc_chunk *bk;  /* 指向下一个空闲内存块的指针(用于空闲内存列表) */};

在这里插入图片描述
图片来自wx公众号“CppPlayer”
malloc分配内存后返回的指针不是指向Header,而是指向Payload的起始位置,所占用的空间大小记录在参数指针指向地址的前面,所以知道需要释放内存的大小

几个小知识:
malloc不是系统调用,通过 brk()从堆区分配内存 或 mmap()在文件映射区域分配虚拟内存。
只有当程序首次访问这片地址,操作系统通过MMU将虚拟地址转为物理地址,更新页表完成映射;如果这片内存实际没有使用过,不会分配实际的物理空间,节约内存。
调用free,内存不会马上被操作系统回收。为了减少与操作系统内存交互次数,降低系统开销。
首先会被内存管理器使用双链表等方式保存起来,有助于减少内存碎片和提高内存使用效率。

4. main()函数执行前还会执行什么代码

  1. 初始化全局变量
  2. 执行 全局对象 的构造函数
  3. 类内部声明的 静态成员对象 属于整个类而不是类的实例,因此提前初始化
  4. c运行时库初始化通常包括 设置缓冲区和初始化堆。c++可能进行初始化操作:设置运行环境、配置标准输入输出…

5. 堆和栈的数据访问速度

栈通常比堆块。
栈的数据存储在连续的内存单元,访问速度快;堆的数据存储在分散的存储空间,需要额外的指针解引用操作

栈特点:
自动管理:内存分配和回收由编译器自动处理
连续内存:栈内存一般连续,有助于优化cpu缓存
快速分配和回收:栈管理简单,分配和回收速度快
固定大小:栈大小通常在程序运行前就已经决定,超出后会发生栈溢出。
寻址方式:直接寻址

堆特点:
动态分配:显示分配
非连续内存:堆分配内存一般不连续,因为堆可以被分成多个部分,每部分可以独立回收和分配(内存碎片产生原因)
寻址方式:间接寻址

6. 构造函数不能为虚函数

  1. 从代码层面看
    虚函数表中存储了一个类所有虚函数的地址,它允许通过基类的指针调用派生类函数,实现运行时多态。
    虚表存储在只读数据段,虚函数表地址在编译时被确定,并链接到程序的二进制文件。
    当一个类被创建时,才会有虚表指针指向虚函数表,对象在没有初始化完成的时候不知道虚表位置,自然不能访问虚表内容
  2. 从设计角度看
    虚表的存在主要是为了解决 编译期间没办法确定具体调用对象的问题,但c++在编译期间就能确定要创建的对象具体类型,没有意义

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

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

相关文章

LeetCode 918. 环形子数组的最大和

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n…

Node.JS 版本管理工具 Fnm 安装及配置(Windows)

Fnm 安装及配置&#xff08;Windows&#xff09; Fnm&#xff08;Fast Node Manager&#xff09;&#x1f680; 一个快速而简单的 Node.js 版本管理工具&#xff0c;使用 Rust 编写。 1 安装 官网&#xff1a;Fnm&#xff08;镜像网站 &#xff09;。下载&#xff1a;Fnm&a…

【议题征集 】上海站 nMeetup 将于十月份开启!

上海&#xff0c;作为我国的经济和金融中心&#xff0c;正迅速发展成为全球领先的科技创新城市。这座城市不仅拥有深厚的文化底蕴&#xff0c;还积极拥抱数字化转型&#xff0c;推动着数据库和人工智能基础设施的快速发展。第三站 nMeetup 我们将走进上海&#xff0c;本次活动由…

被Karpathy誉为“蕴藏着类似ChatGPT的机会的AI产品Notebook LM”,它到底做对了什么?

就在昨天&#xff0c;Karpathy在X上连续发布了多条安利帖&#xff0c;强烈地给大家推荐一个AI产品NotebookLM。 嘶&#xff5e;给周围人疯狂种草并不稀奇&#xff0c;但Karpathy的推荐理由给NotebookLM戴了一个高帽子-他提到这款产品让人联想到ChatGPT。 这种就令人好奇&#…

数通 1

通信&#xff1a;需要介质才能通信电话离信号塔&#xff08;基站&#xff09;越远&#xff0c;信号越弱。信号在基站之间传递。你离路由器越远&#xff0c;信号越差。一个意思 比如想传一张图片&#xff0c;这张图片就是数据载荷 网关&#xff0c;分割两个网络。路由器可以是网…

vue + echarts 快速入门

vue echarts 快速入门 本案例即有nodejs和vue的基础&#xff0c;又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…

TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用

TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…

【15%】100小时机器学习——什么是机器学习

前言 虽然已经好久没有更新了&#xff0c;但笔者最近一直都在努力学习哦。 前面三三两两根据GitHub上的项目写了一些实验操作&#xff0c;但是总觉得这样是不行的。碎片化的学习只能是建立在已知的基础上进行熟练&#xff0c;不能作为打基础的主力方法&#xff0c;最关键的是&a…

用责任链模式改造 if else

我的上一篇文章&#xff0c;因为if else 多了&#xff0c;捣鼓很久&#xff0c;今天用责任链模式改造一下。 代码写着写着&#xff0c;if else if 逻辑忘记了&#xff0c;哎。。。-CSDN博客 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 1. 什么是责任…

Linux下的基本指令/命令(一)

目录 基本命令 1. Is命令/指令: 罗列当前目录下指定的文件或者目录. 2. pwd命令&#xff1a; 查看当前工作的路径 3. cd命令&#xff1a; 切换到指定路径下。 只能切换到目录中 4. tree命令: 树状显式目录 使用前要输入命令 yum install -y tree &#xff0c;用来安装一个…

Redis入门第二步:Redis数据类型详解

摘要&#xff1a; 欢迎继续跟随《Redis新手指南&#xff1a;从入门到精通》专栏的步伐&#xff01;在本文中&#xff0c;我们将深入探讨Redis支持的各种数据类型&#xff0c;这些类型是Redis强大功能的核心。通过学习不同的数据类型&#xff0c;你将能够根据具体的应用需求选择…

【Spring基础3】- Spring的入门程序

目录 3-1 Spring的下载3-2 Spring的 jar 包3-3 第一个 Spring程序第一步&#xff1a;添加spring context的依赖&#xff0c;pom.xml配置如下第二步&#xff1a;添加junit依赖第三步&#xff1a;定义bean&#xff1a;User第四步&#xff1a;编写spring的配置文件&#xff1a;bea…

技术成神之路:设计模式(十八)适配器模式

介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许接口不兼容的类可以协同工作&#xff0c;通过将一个类的接口转换成客户端所期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的类可以一起工作。 1.定义 适配…

python编程开发“人机猜拳”游戏

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

计算机毕业设计 基于深度学习的短视频内容理解与推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【架构】前台、中台、后台

文章目录 前台、中台、后台1. 前台&#xff08;Frontend&#xff09;特点&#xff1a;技术栈&#xff1a; 2. 中台&#xff08;Middleware&#xff09;特点&#xff1a;技术栈&#xff1a; 3. 后台&#xff08;Backend&#xff09;特点&#xff1a;技术栈&#xff1a; 示例场景…

万界星空科技铜拉丝行业MES系统,实现智能化转型

一、铜拉丝行业生产管理的难点主要体现在以下几个方面&#xff1a; 1、标准严格&#xff1a;铜线产品对质量的要求极高&#xff0c;特别是在电气性能、导电性、耐腐蚀性等方面&#xff0c;任何微小的瑕疵都可能影响产品的使用效果和安全性。 2、过程监控&#xff1a;生产过程…

极速 JavaScript 打包器:esbuild

文章目录 前言什么是esbuild&#xff1f;esbuild如何实现如此出色的性能&#xff1f;基本配置入口文件输出文件模块格式targetplatformexternalbanner和footer 结论 前言 esbuild是一个快速、可扩展的JavaScript打包器和压缩器&#xff0c;它的目标是成为最快的打包器。它使用…

【C++篇】启航——初识C++(下篇)

接上篇【C篇】启航——初识C&#xff08;上篇&#xff09; 目录 一、引用 1.引用的概念 2.引用的基本语法 3.引用的特点 3.1 别名 3.2 不占用额外内存 3.3 必须初始化 3.4 不能为 NULL 4.引用的使用 4.1 函数参数传递 4.2 返回值 4.3 常量引用 5.引用和指针的关…

Spring Task 2024/9/30

Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定时间自动执行某个代码逻辑。 作用&#xff1a;定时自动执行某段java代码。 cron表达式 在线Cron表达式生成器 (qqe2.com)&#x1f448;在线生成网站 入门案例 SkyApplication 启动类 package com.sky;im…