c++面试整理(二)
一、new和malloc的区别
1.属性:
new属于c++运算符,编译器支持就可以,makkoc是c的标准库函数,需要引用头文件才可以调用。
2.参数和返回值
malloc分配内存时需要指定内存大小,返回值是void*的指针,需要强制转换
new根据类型自动计算所需的空间大小,返回的是对象类型的指针。
3.安全性:
new操作符在分配内存失败时会抛出一个std::bad_alloc异常。这使得你可以更优雅地处理内存分配失败的情况。
malloc在内存分配失败时返回NULL。如果你忘记检查malloc的返回值,这可能会导致程序崩溃。
4.构造函数和析构函数
new操作符在分配内存后会调用对象的构造函数。这确保了对象在创建时就被正确地初始化。同样地,当使用delete释放内存时,对象的析构函数也会被调用。
malloc和free则不会调用构造函数或析构函数。因此,如果你正在分配一个类的实例,并且该类有构造函数或析构函数,那么你应该使用new和delete而不是malloc和free。
5.内存使用差异
malloc是从堆上动态分配内存。堆是操作系统中维护的一块特殊内存,用于程序的内存动态分配。
new则是从自由存储区上为对象动态地分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请的内存,都称为自由存储区。自由存储区不仅可以是堆,还可以是静态存储区,这取决于operator new在哪里为对象分配内存。
二、vector,list,map
在选择使用哪种容器时,应根据具体需求进行权衡。
如果需要频繁访问元素且内存分配不是问题,vector可能是一个好选择;
如果需要频繁插入和删除元素,list可能更适合;
而如果需要存储键值对并高效查找、插入和删除元素,那么map将是最佳选择。
1.底层实现和内存分配:
- vector的底层实现是一块连续的内存空间,因此支持通过下标快速访问元素。然而,当vector需要扩展容量时,它可能会申请一块更大的连续内存空间,并将原有元素复制到新空间中,然后释放原空间。这个过程可能导致性能开销,尤其是当在头部或中间位置插入元素时。
- list通过双向链表实现,其元素在内存中不一定连续。list的插入和删除操作只需调整相关节点的指针,无需移动大量数据,因此在频繁插入和删除的场景下性能更优。
- map的底层实现通常采用平衡二叉树(如红黑树),它存储的是键值对(key-value)。这种结构使得map在查找、插入和删除元素时都能保持相对稳定的性能,时间复杂度通常接近O(log n)。然而,由于平衡二叉树的特性,map不支持通过下标直接访问元素。
2.访问效率:
- vector和list都支持通过迭代器访问元素,但vector还支持通过下标直接访问,这在需要频繁访问元素时具有优势。
- 然而,list由于是通过链表实现的,访问任意位置的元素可能需要遍历链表,因此访问效率相对较低。
- map的访问效率取决于其底层实现(平衡二叉树)。虽然不如vector通过下标访问那样直接,但map的查找效率通常也很高,尤其是在数据量较大时。
3.用途和使用场景:
- vector适用于需要频繁访问元素且内存分配不是主要问题的场景,如数组或类似数组的数据结构。
- list适用于需要频繁插入和删除元素的场景,如链表数据结构。
- map则适用于需要存储键值对并高效查找、插入和删除元素的场景,如字典或哈希表。
三、c++代码如何调用c语言的代码?
在C++中调用C语言代码是完全可能的,并且这在混合编程中是非常常见的做法。以下是如何在C++代码中调用C语言代码的基本步骤:
- 在C语言代码中,确保你的函数使用extern "C"声明:
这是因为C++支持函数重载,它使用函数名修饰(也称为名称重整或名称修饰)来区分具有相同名称但不同参数类型的函数。而C语言不支持函数重载,因此不会进行这样的名称修饰。使用extern "C"告诉C++编译器这个函数是用C语言链接规范来编译的,这样就不会进行名称修饰。
例如:
// file: my_c_code.c
#include <stdio.h> extern "C" { void my_c_function() { printf("Hello from C!\n"); }
}
- 在C++代码中,包含C语言代码的头文件,并直接调用该函数:
你不需要在C++代码中再次声明extern “C”,只需直接调用函数即可。
例如:
// file: my_cpp_code.cpp
extern "C" void my_c_function(); // Declare the function, but do not define it here. int main() { my_c_function(); // Call the function return 0;
}
- 编译和链接:
你需要将C和C++代码一起编译和链接。具体的编译和链接命令取决于你使用的编译器和构建系统。一般来说,你可能需要分别编译C和C++文件,然后将它们链接在一起。
例如,使用g++(GNU编译器集合的C++编译器)可以这样操作:
g++ -c my_c_code.c -o my_c_code.o # Compile the C code
g++ my_cpp_code.cpp my_c_code.o -o my_program # Link the C++ code with the compiled C code
然后,你就可以运行生成的程序了:
./my_program
这应该会输出 “Hello from C!”。
四、sizeof 和 strlen 的区别?
1.sizeof 是一个操作符,strlen 是库函数。
2.sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\0‘的字符串作参数。
3.编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
4.数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof。
相关文章:
c++面试整理(二)
一、new和malloc的区别 1.属性: new属于c运算符,编译器支持就可以,makkoc是c的标准库函数,需要引用头文件才可以调用。 2.参数和返回值 malloc分配内存时需要指定内存大小,返回值是void*的指针,需要强制转换 new根…...
Python中的区块链技术与应用
区块链技术是一个复杂的概念,涉及许多不同的方面,如加密算法、数据结构、网络协议等。在这里,我将提供一个简单的区块链实现示例,以帮助你理解其基本概念。请注意,这个示例是为了教学目的而简化的,并不适用…...
opencv-python 霍夫变换圆形检测:HoughCircles
文章目录 简介代码HoughCircles函数说明 简介 opencv中提供了基于霍夫变换的圆形检测方法,可实现下图所示的检测结果。 其中,【gray】是经过均值滤波的灰度图,其目的是将目标边缘凸显出来;【edge】是通过Canny边缘检测得到的灰度…...
行为型-观察者模式
文章目录 基本概念定义使用场景代码实现 延伸阅读java监听机制spring监听机制 基本概念 定义 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 观察者模式…...
《ElementPlus 与 ElementUI 差异集合》el-input 和 el-button 属性 size 有变化
差异 ** element-ui el-input、el-input-number 和 el-button 中,属性size 值是 medium / small / minielement-plus el-input、el-input-number 和 el-button 中,属性size 值是 large / default /small 如果你是自动升级,Vue3 系统会有如…...
pxe安装mini centos系统
一、准备工作 1、关闭防火墙和selinux systemctl stop firewalld && systemctl disable firewalldsetenforce 02、配置静态ip 需要在dhcp里面填写tftp配置,所以需要固定ip 二、dhcp安装配置 作用:给客户端提供ip地址,并告诉客户…...
Android studio 性能调试
一、概述 Android studio 的Profiler可用来分析cpu和memory问题,下来进行说明介绍。 二、Android studio CPU调试 从开发模拟器或设备中启动应用程序; 在 Android Studio 中,通过选择View > Tool Windows > Profiler启动分析器。 应…...
java8特性 stream流中map函数的使用
map 函数的作用就是针对管道流中的每一个数据元素进行转换操作。 例如 将集合中的每一个字符串,全部转换成大写! List<String> collect alpha.stream().map(String::toUpperCase).collect(Collectors.toList()); //上面使用了方法引用…...
【Emgu CV教程】9.5、形态学常用操作之形态学梯度
文章目录 一、相关概念1.什么叫形态学梯度2.形态学梯度的函数 二、演示1.原始素材2.代码3.运行结果 一、相关概念 1.什么叫形态学梯度 形态学梯度,就是用膨胀的原始图像减去腐蚀的原始图像,所以它的特性就是去除前景物体的内部区域,只得到前…...
算法笔记之蓝桥杯pat系统备考(2)
算法笔记之蓝桥杯&pat系统备考(1) 文章目录 五、数学问题5.2最大公约数和最小公倍数5.2.1最大公约数5.2.2最小公倍数 5.3分数的四则运算5.3.1分数的表示与化简5.3.2分数的四则运算5.3.3分数的输出 5.4素数(质数)5.4.1[素数的…...
基于SpringBoot+Druid实现多数据源:注解+编程式
前言 本博客姊妹篇 基于SpringBootDruid实现多数据源:原生注解式基于SpringBootDruid实现多数据源:注解编程式基于SpringBootDruid实现多数据源:baomidou多数据源 一、功能描述 配置方式:配置文件中配置默认数据源,…...
已解决org.apache.zookeeper.KeeperException.BadVersionException异常的正确解冲方法,亲测有效!!!
已解决org.apache.zookeeper.KeeperException.BadVersionException异常的正确解冲方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 总结 博主v:XiaoMing_Java 问题分析 在使用Apache ZooKeeper进行…...
数据结构:堆
堆的概念 1.堆是一个完全二叉树 2.小堆(任何一个父亲<孩子),大堆(任何一个父亲>孩子) 堆的结构 物理结构:数组 逻辑结构:二叉树 #pragma once #include<assert.h> #include<iostream> typedef int HPDataType; typedef struct Heap {HPDataType* _a;int…...
CSS中三栏布局的实现
三栏布局一般指的是页面中一共有三栏,左右两栏宽度固定,中间自适应的布局,三栏布局的具体实现: 利用绝对定位,左右两栏设置为绝对定位,中间设置对应方向大小的margin的值。 .outer {position: relative;h…...
Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程
Linux使用MCSM面板搭建我的世界(Minecraft)整合包服务器,MC开服教程,All the Mods 9(ATM9)整合包搭建服务器的教程。 本教程使用Docker来运行mc服,可以方便切换不同Java版本,方便安装多个mc服版本。 视频教程:https:…...
让数据在业务间高效流转,镜舟科技与NineData完成产品兼容互认
近日,镜舟科技与NineData完成产品兼容测试。在经过联合测试后,镜舟科技旗下产品与NineData云原生智能数据管理平台完全兼容,整体运行高效稳定。 镜舟科技致力于帮助中国企业构建卓越的数据分析系统,打造独具竞争力的“数据护城河”…...
2.1HTML5基本结构
HTML5实际上不算是一种编程语言,而是一种标记语言。HTML5文件是由一系列成对出现的元素标签嵌套组合而成,这些标签以<元素名>的形式出现,用于标记文本内容的含义。浏览器通过元素标签解析文本内容并将结果显示在网页上,而元…...
设置浏览器显示小于12px以下字体
问题 我们在项目开发过程中有时候会遇到设计师给的小于12px的字体,IE、火狐浏览器、移动端等小于12px的字号大小还是可以正常显示的,但是谷歌浏览器上显示字体最小为12px,css设置font-size:10px,运行代码显示结果仍然…...
web蓝桥杯真题:成语学习
代码: //TODO 点击文字后,在idiom从左到右第一个空的位置加上改文字 getSingleWord(val) {let index this.idiom.indexOf() //从左往右查询空字符串this.$set(this.idiom, index, val) //响应式更新 },// TODO 校验成语是否输入正确答案 confirm…...
外包干了5天,技术明显退步。。。。。
先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
