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年的功能测试&…...
cool-admin(midway版)数据权限缓存:基于用户角色的权限数据预加载
cool-admin(midway版)数据权限缓存:基于用户角色的权限数据预加载 【免费下载链接】cool-admin-midway 🔥 cool-admin(midway版)一个很酷的后台权限管理框架,模块化、插件化、CRUD极速开发,永久开源免费,基于midway.js…...
ESP32智能硬件开发实战:基于MCP协议的AI语音助手全栈指南
ESP32智能硬件开发实战:基于MCP协议的AI语音助手全栈指南 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 在AIoT(人工智能物联网)…...
C语言学习笔记——2(数据类型,运算符)
数据类型机器中每个字节都有地址CPU通过地址访问字节空间#include <stdio.h>int main() {int a 0xEEAABAAA;printf("%#x, %d\n",a,a);unsigned int b 0xEEAABAAA;printf("%#x, %u\n",b,b);return 0; }运行结果:0xeeaabaaa, -290800982 …...
TextInput Effects部署与测试:确保跨平台兼容性的完整流程
TextInput Effects部署与测试:确保跨平台兼容性的完整流程 【免费下载链接】react-native-textinput-effects Text inputs with custom label and icon animations for iOS and android. Built with react native and inspired by Codrops. 项目地址: https://git…...
Omni-Vision Sanctuary 网络协议分析辅助:可视化网络数据包与流量模式识别
Omni-Vision Sanctuary 网络协议分析辅助:可视化网络数据包与流量模式识别 1. 网络数据可视化的新思路 网络工程师每天面对海量的数据包和流量日志,传统的分析工具往往需要依赖复杂的命令行操作和专业图表解读。而Omni-Vision Sanctuary模型为我们提供…...
利用快马平台快速搭建comfyui工作流原型,十分钟验证ai绘画创意
最近在尝试用ComfyUI搭建AI绘画工作流时,发现从零开始调试节点连接特别耗时。后来发现InsCode(快马)平台的AI生成功能能快速搭建原型,把验证周期从几小时缩短到十分钟,分享下具体实践: 为什么需要快速原型验证 传统ComfyUI工作流搭…...
Llama-3.2V-11B-cot入门必看:Streamlit会话状态管理保障多用户隔离
Llama-3.2V-11B-cot入门必看:Streamlit会话状态管理保障多用户隔离 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡4090环境深度优化。该工具通过Streamlit框架构建了宽屏友好的交互界面…...
[特殊字符] GLM-4V-9B企业级方案:客户上传截图问题自动诊断
GLM-4V-9B企业级方案:客户上传截图问题自动诊断 1. 引言 想象一下这个场景:你是一家SaaS公司的技术支持工程师,每天的工作就是处理海量的客户工单。其中,有相当一部分问题描述是模糊的,比如“我的页面显示不正常”、…...
从Flatten到Hierarchy:数字IC后端工程师必须掌握的时序收敛技巧
从Flatten到Hierarchy:数字IC后端工程师必须掌握的时序收敛技巧 在22nm以下工艺节点,单芯片晶体管数量已突破10亿大关。面对如此庞大的设计规模,传统扁平化(Flatten)流程如同试图用绣花针建造摩天大楼——理论上可行&a…...
利用快马AI快速原型化一个Python Socket聊天室应用
最近在学习计算机网络相关的知识,发现Socket编程是个很有意思的实践方向。正好在InsCode(快马)平台上尝试用AI快速原型化了一个Python Socket聊天室应用,整个过程比想象中顺利很多,分享下我的实现思路和体验。 项目背景与需求分析 这个聊天…...
