【c++面试总结】

news2024/9/30 23:08:17

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); // ambiguous

    return 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.coloradmin.cn/o/2180965.html

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

相关文章

2024大二上js高级+ES6学习9.23(严格模式,this指向和改变this指向,高阶函数)

9.23.2024 函数进阶 1.函数定义方式 2.函数的调用方式 3.函数的this指向 而普通函数、定时器函数。立即执行函数一般是window调用的 构造函数调用&#xff1a;原型对象中的方法是在实例对象调用这个方法时&#xff0c;才指向实例对象。 4.改变函数的this指向&#xff08;ca…

体育馆智能化系统规划方案

1. 体育馆智能化系统规划概述 本文详细介绍了一个室内体育馆的智能化系统规划方案&#xff0c;旨在通过优化建筑结构、系统、服务和管理&#xff0c;创建一个高效、舒适、便利的环境。该体育馆按照国家三级乙等标准设计&#xff0c;总建筑面积约1.69万平方米&#xff0c;智能化…

基于深度学习的点云处理模型PointNet++学习记录

前面我们已经学习了Open3D&#xff0c;并掌握了其相关应用&#xff0c;但我们也发现对于一些点云分割任务&#xff0c;我们采用聚类等方法的效果似乎并不理想&#xff0c;这时&#xff0c;我们可以想到在深度学习领域是否有相关的算法呢&#xff0c;今天&#xff0c;我们便来学…

在树莓派上部署开源监控系统 ZoneMinder

原文&#xff1a;https://blog.iyatt.com/?p17425 前言 自己搭建&#xff0c;可以用手里已有的设备&#xff0c;不需要额外买。这套系统的源码是公开的&#xff0c;录像数据也掌握在自己手里&#xff0c;不经过不可控的三方。 支持设置访问账号 可以保存录像&#xff0c;启…

ST-GCN模型实现花样滑冰动作分类

加入深度实战社区:www.zzgcz.com&#xff0c;免费学习所有深度学习实战项目。 1. 项目简介 本项目实现了A042-ST-GCN模型&#xff0c;用于对花样滑冰动作进行分类。花样滑冰作为一项融合了舞蹈与竞技的运动&#xff0c;其复杂的动作结构和多变的运动轨迹使得动作识别成为一个具…

redis-数据类型

十大数据类型 学习 redis 操作手册 英文 Commands 中文 Redis命令中心&#xff08;Redis commands&#xff09; – Redis中国用户组&#xff08;CRUG&#xff09; 学习方法 举出一个数据结构的应用场景&#xff08;理解数据结构特点&#xff09;&#xff0c;并操作&…

深度学习模型可视化工具 Netron 使用教程

Netron 介绍 Netron 是一个用于可视化机器学习模型、深度学习模型、神经网络、图模型&#xff08;例如用于计算机视觉的 ONNX、Caffe、TensorFlow Lite、TensorFlow.js、Keras、Darknet、TVM、PyTorch、TorchScript、Core ML、ML.NET、NNEF、PaddlePaddle、OpenVINO、Arm NN等…

C++STL--------string

文章目录 一、STL介绍二、string1、constructor构造函数2、operator[]方括号运算符重载3、iterator迭代器4、reverse_iterator反向迭代器5、size和length6、capacity7、clear8、shrink_to_fit9、at10、push_back11、append 二、auto类型(C11)1、使用2、真正的价值 三、范围for(…

基于大数据技术的宠物商品信息比价及推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

自己做个国庆75周年头像生成器

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 下载相关代码&#xff1a;【免费】《自己做个国庆75周年头像生成器》代码资源-CSDN文库 又是一年国庆节&#xff0c;今年使用国旗做…

MFU简介

1、缩写 MFU - Mask Field Utilization&#xff08;光刻掩膜版有效利用比例&#xff09; GDPW - Gross Die Per Wafer&#xff0c;每张wafer上die的数量 2、什么是MASK 在光刻机中&#xff0c;光源&#xff08;紫外光、极紫外光&#xff09;透过mask曝光在晶圆上形成图…

华大HC32F448的FreeRTOS移植

为什么要移植FreeRTOS? 目前的程序只是前后台查询方式的架构&#xff0c;有些场合更适用FreeRTOS(免费使用)。 下载地址&#xff1a; 下载 FreeRTOS - FreeRTOS™ 相关知识入门&#xff1a; FreeRTOS™ - FreeRTOS™ &#xff08;网址&#xff09; FreeRTOSv9.0.0文件夹…

总结C/C++中内存区域划分

目录 1.C/C程序内存分配主要的几个区域&#xff1a; 2.内存分布图 1.C/C程序内存分配主要的几个区域&#xff1a; 1、栈区 2、堆区 3、数据段&#xff08;静态区&#xff09; 4.代码段 2.内存分布图 如图&#xff1a; static修饰静态变量成员——放在静态区 int globalVar 是…

ESXI识别服务器磁盘,虚拟机显示无效

ESXI识别服务器磁盘&#xff0c;虚拟机显示无效 系统意外断电识别不到磁盘的情况下可以管理-》硬件-》搜索磁盘名称&#xff0c;选择切换直通&#xff0c;则虚拟机正常。

COMP 6714-Info Retrieval and Web Search笔记week2

tokenizer&#xff1a;分词器 右半部分&#xff1a;倒排索引 Westlaw AND&#xff08;&&#xff09;&#xff1a; 要搜索必须同时出现在文档中的两个或多个词语&#xff0c;请使用 AND&#xff08;&&#xff09;。例如&#xff0c;输入 narcotics & warrant&#x…

DialMAT:跨模态特征提取与对抗训练的结合

目录 一、背景介绍二、技术路线2.1 DialMAT的总体架构2.2 基于矩的对抗训练&#xff08;MAT&#xff09;2.3 跨模态并行特征提取参考文献 一、背景介绍 在智能体研究领域&#xff0c;一个重要的挑战是如何让智能体有效理解人类的语言指令并在实际环境中完成任务。尤其是在复杂环…

光通信——PON技术

PON网络结构 PON&#xff08;Passive Optical Network&#xff0c;无源光网络&#xff09;系统的基本组成包括OLT&#xff08;Optical Line Terminal&#xff0c;光线路终端&#xff09;、ODN&#xff08;Optical Distribution Network&#xff0c;光分配单元&#xff09;和ON…

机器学习基本上就是特征工程——《特征工程训练营》

作为机器学习流程的一部分&#xff0c;特征工程是对数据进行转化以提高机器学习性能的艺术。 当前有关机器学习的讨论主要以模型为中心。更应该关注以数据为中心的机器学习方法。 本书旨在介绍流行的特征工程技术&#xff0c;讨论何时以及如何运用这些技术的框架。我发现&…

Linux C 编程

Linux C 编程 在此推荐一个非常好的学习资料 统计文件单词数量 统计一个文件中的单词数量&#xff0c;可以将文件中的所有字符分为字母和分隔符。分隔符不属于单词内部&#xff0c;故定义一个状态机&#xff0c;来记录当前读取字符的状态。用 OUT 表示此字符不属于一个单词&…

【解决】Mac 上 M系列芯片用 Vmware Fusion安装 win11 遇到的主要的问题汇总

此文很短&#xff0c;没闲话&#xff0c;干活满满 Mac 版本最干净版本的 win11 免费下载链接 &#xff1a;链接&#xff1a;https://pan.quark.cn/s/4e8e8bb93564 本文实验电脑为&#xff1a;Macbook Air M3 第一个问题&#xff1a;如何解决安装Windows11时出现“这台电脑无…