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年的功能测试&…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
