【Q4-20min】

1.堆和栈的区别
(1)数据结构:栈和堆都是内存数据结构,栈是一种线性结构,堆是一种树形结构。
(2)内存分配方式:栈采用的是静态内存分配,系统在编译阶段就确定了分配给栈的内存空间,而且栈内存的释放是由系统自动完成的。而堆采用的是动态内存分配,程序在运行时可以向操作系统请求动态分配一段空间,然后使用完之后再手动释放。
(3)存储内容:栈中存储的是函数的调用和局部变量,而堆中存储的是对象的实例。
(4)访问方式:栈是一种后进先出(LIFO)的数据结构,只有栈顶的元素可以被访问和操作,而堆是一棵树形结构,其存储的元素可以被通过指针或引用访问。
(5)内存分配效率:栈的内存分配效率比较高,因为栈是一种内存结构,其内存块相互紧凑,可以直接通过指针操作,而堆的内存分配效率相对低一些,因为需要手动分配和释放内存空间。

优势:
栈:栈内存分配效率高,读写速度快,由于栈是一种线性结构,因此其内存使用效率高。
堆:堆可以动态分配内存,因此在使用时比较灵活,同时堆中存储的对象可以被持久化,不会随着函数调用结束而被销毁。

缺点:
栈的缺点在于栈内存空间有限,存储空间比堆小,且存在变量过多或递归调用可能引起栈溢出的问题,比较容易导致系统崩溃。
堆的缺点在于内存分配和释放需要手动进行操作,如果分配的内存空间过多或者没有及时释放会导致内存泄漏或内存溢出的问题。

特点:
栈:可以快速地入栈、出栈,栈顶元素可以被随时访问和操作,适合存储函数调用、局部变量等栈式数据。
堆:具有动态分配和释放内存空间的灵活性,存储的对象实例可以被持久化,适合存储较大的数据结构,如数组、对象等。

总的来说:
栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆 是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在 区域不连续,会有碎片。
(1)功能不同:栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变 量,还是类变量,它们指向的对象都存储在堆内存中。
(2)共享性不同:栈内存是线程私有的。 堆内存是所有线程共有的。
(3)异常错误不同:如果栈内存或者堆内存不足都会抛出异常。 栈空间不足:java.lang.StackOverFlowError。 堆空间 不足:java.lang.OutOfMemoryError。
(4)空间大小:栈的空间大小远远小于堆的。

2.宏和内联函数的区别
对于一个频繁调用的短小函数,如果我们正常的作为一个函数来调用,会增加时间和空间的开销,影响函数的执行效率。
在C语言中,我们常用宏定义来实现,在C++中,我们使用内联函数(inline)来实现。
宏定义和内联函数(inline)的区别
(1)inline在编译期间展开(将实参传递给形参,使用函数的代码替换函数的调用),而宏在预处理时进行文本替换。
(2)inline标识的是一个函数,采用的是参数传递,而宏定义是文本替换的一种方式。
(3)内联函数会进行类型的安全检查、语法判断,而宏定义在文本替换后有可能导致编译错误。
(4)宏是无类型的,将其用于如何类型,运算都是有意义的。内联函数则需要通过创建模板使得函数独立于类型。

3.++i和i++那个效率高?说一下各自的用法.
简单使用时,俩这效率没有什么区别!
对于自定义类型,在类里使用的时候,++i的效率更高!
基本概念:两者的作用都是自增加1。
单独拿出来说的话,++i和i++,效果都是一样的,就是i=i+1。
两者参与运算时的区别就是:
a=i++ , a 返回原来的值 a=i, i=i+1;
a=++i , a 返回加1后的值, a=i+1, i=i+1。
也就是i++是先赋值,然后再自增;++i是先自增,后赋值。
第二个区别就是: i++不能作为左值,而++i可以。

i++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;++i是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值。
由于要生成临时对象,i++需要调用两次拷贝构造函数与析构函数(将原对象赋给临时对象一次,临时对象以值传递方式返回一次);
++i由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。
所以在使用类等自定义类型的时候,应尽量使用++i

4.C和C++ 区别
相同点:
(1)源代码的格式和文件扩展名相同,都是以 .c 结尾。
(2)变量和函数都需要声明先于使用。
(3)表达式、变量、常量等语法结构相同,具有相同的控制结构,如表达式、条件语句、循环语句等。
(4)在低级别时,C 语言和 C++ 语言之间没有差异,它们都可以使用底层的指针和数组操作等。
差异点:
(1)C++ 是基于 C 语言的基础上发展而来的,C++ 最大的区别就是支持面向对象编程。C 语言不支持面向对象编程。
(2)C++ 支持函数重载、命名空间、类和对象、继承、多态等高级概念,而 C 语言没有这些概念。
(3)C++ 有异常处理机制,C 语言没有。
(4)在类型检查方面,C++ 语言具有更严格的类型检查机制,可以更好地避免类型错误,其类型转换规则相对复杂,但更加表达了明确的要求。C 语言的类型转换相对宽松,易于操作,但更容易出现类型错误。
(5)C 语言中的标准库中包含了一些操作系统服务,而 C++ 中的标准库更加强大、更加方便。
(6)C++ 支持泛型编程概念,比如使用模板来实现自定义类型或函数。C 语言则不支持这个概念。

总之,C++ 语言在保留了 C 语言底层编程的优点的同时,提供了支持面向对象编程、多态、继承等高级概念的特点,更加适合大规模软件项目和复杂模型的开发。但如果仅需要进行底层的硬件交互、系统编程等工作,C 语言更加合适。

5.构造函数和析构函数的执行顺序
(1)构造函数顺序
① 基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序。
② 成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序。
③ 派生类构造函数。
(2)析构函数顺序(与构造顺序相反)
① 调用派生类的析构函数。
② 调用成员类对象的析构函数。
③ 调用基类的析构函数。

6.指针和引用的区别
(1)初始化:引用在定义时必须初始化,指针则没有要求(尽量初始化,防止野指针)
(2)引用在初始化引用一个实体后,就不能再引用其它实体,而指针可以在任意时候指向一个同类型实体
(3)没有NULL引用,但是有nullptr指针
在sizeof中含义不同: 引用结果为引用类型的大小,但指针始终是地址空间,所占字节个数(32位平台占4个字节)
(4)引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
(5)有多级指针,但没有多级引用
(6)访问实体的方式不同,指针需要显式解引用,引用编译器自己处理
(7)引用比指针使用起来相对安全

7.引用需要开辟新的内存空间吗?
在 C++ 中,引用本身不会占用额外的内存空间,因为引用本质上只是一个别名或者说是指针的另一种表现形式。换句话说,当我们声明一个引用变量时,它只是为原变量起了一个别名,引用变量和原变量指向同一个内存地址,因此引用变量不需要分配额外的内存空间。
引用的底层实现通常是通过指针来实现的,而指针是需要占用内存空间的,因此,当我们使用引用时,实际上是在使用底层指针所指向的对象,而不是引用本身。在这种情况下,所占用的内存空间取决于所引用的对象的类型和 大小,而不是引用本身。

8.解释一下封装、继承、多态
(1)封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互.
(2)继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称子类或者派生类,被继承的类称为父类或基类。使用继承是为了减少代码的冗余,增强代码的可扩展性。
(3)多态: 指不同对象接收到同一消息时会产生不同的行为(一个接口,多种方法)
简单来说,就是在同一个类或继承体系结构的基类与派生类中,用同名函数来实现各种不同的功能.

9.C++的编译环境
GCC编译流程分为四个步骤:
预处理(生成.i/.ii文件)、编译(生成.s/.S文件)、汇编(生成.o文件)、链接(生成.out文件)。

C++的编译环境通常包括编译器、链接器和一些辅助工具。以下是C++编译环境的主要组成部分:
1.编译器(Compiler):
2.GNU Compiler Collection (GCC): 这是一个广泛使用的开源编译器,支持多种编程语言,包括C++。你可以使用g++命令编译C++程序。
3.Microsoft Visual C++: 对于Windows平台,Visual Studio提供了Microsoft的C++编译器。
4.集成开发环境(Integrated Development Environment,IDE):
5.Eclipse CDT: Eclipse是一个开源的IDE,CDT插件提供了对C和C++的支持。
6.Code::Blocks: 一个轻量级、开源的C++ IDE,可跨平台运行。
7.Visual Studio: Microsoft的集成开发环境,提供了强大的C++支持。
8.构建系统(Build System):
9.Makefile: Make是一个构建工具,通过Makefile文件描述项目的构建规则。
10.CMake: 一个跨平台的构建工具,通过一个高级的描述文件生成相应平台的构建系统。
11.调试器(Debugger):
12.GDB (GNU Debugger): 一个强大的开源调试器,用于调试C++程序。
13.Visual Studio Debugger: 集成在Visual Studio中的调试器,提供了图形界面和强大的调试功能。
14.标准库(Standard Library):
15.STL (Standard Template Library): C++标准库的一部分,提供了许多常用的数据结构和算法。
16.操作系统和硬件:
17.编译器和工具的性能和行为通常与操作系统和硬件架构相关。不同的操作系统和硬件可能需要不同的编译选项。

编译和运行C++程序的基本步骤:
18.编写源代码: 使用文本编辑器或IDE编写C++源代码文件,通常以.cpp为扩展名。
19.编译源代码: 使用C++编译器(如g++)将源代码转换为机器可执行的目标代码。命令可能类似于:g++ -o output_file source_file.cpp
20.链接目标代码: 将目标代码与必要的库链接在一起,生成可执行文件。这一步在编译过程中完成,但是有时也可以单独进行。g++ -o output_file source_file.o
21.运行可执行文件: 执行生成的可执行文件。 ./output_file
以上是一般情况下的步骤,具体的细节可能会因操作系统、编译器和开发环境的不同而有所变化。在使用特定工具和平台时,请查阅相关文档以获取详细信息。

  1. 给定10个整数,写出排序算法
    程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。
#define N 10main(){int i,j,min,tem,a[N];/*input data*/printf("please input ten num:\n");for(i=0;i<N;i++){printf("a[%d]=",i);scanf("%d",&a);}printf("\n");for(i=0;i<N;i++)printf("%5d",a);printf("\n");/*sort ten num*/for(i=0;i<N-1;i++){min=i;for(j=i+1;j<N;j++)if(a[min]>a[j]) min=j;tem=a;a=a[min];a[min]=tem;}/*output data*/printf("After sorted \n");for(i=0;i<N;i++)printf("%5d",a);}

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

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

相关文章

共线圆检查

dev_update_off () dev_close_window () dev_open_window (0, 0, 978, 324, black, WindowHandle) dev_set_part (0, 0, 647, 1955) set_display_font (WindowHandle, 16, mono, true, false) dev_set_color (yellow) *检测图中有多少个圈 *dev_set_line_width (3) read_image…

Python Opencv实践 - Yolov3目标检测

本文使用CPU来做运算&#xff0c;未使用GPU。练习项目&#xff0c;参考了网上部分资料。 如果要用TensorFlow做检测&#xff0c;可以参考这里 使用GPU运行基于pytorch的yolov3代码的准备工作_little han的博客-CSDN博客文章浏览阅读943次。记录一下自己刚拿到带独显的电脑&a…

编译器和 IR:LLVM IR、SPIR-V 和 MLIR

编译器通常是各种开发工具链中的关键组件&#xff0c;可提高开发人员的工作效率。编译器通常用作独立的黑匣子&#xff0c;它使用高级源程序并生成语义上等效的低级源程序。不过&#xff0c;它仍然是内部结构倾向的;内部之间流动的内容就称为中间表示 &#xff08;IR&#xff0…

金融帝国实验室(Capitalism Lab)V10版本公司财务报告列示优化

金融帝国实验室&#xff08;Capitalism Lab&#xff09;V10版本公司财务报告列示优化 ————————————— ★【全新V10版本开发播报】★ 即将发布的V10版本中的公司财务报告&#xff08;指标&#xff09;列示优化&#xff1a; ◈ 新增了一个按钮&#xff0c;用于在历史…

Android启动系列之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…

linux的ping命令

Linux系统中的ping命令是一个常用的网络诊断工具&#xff0c;用来检测网络的连通性以及测试网络的延迟和数据包丢失情况。 以下是ping命令的具体使用方法&#xff1a; 基础用法&#xff1a;ping [选项] [目标主机]不带任何选项时&#xff0c;ping会发送一个ICMP请求到目标主机…

【shell】

shell 一、shell简介二、shell脚本的执行方式三、shell变量3.1 shell变量介绍3.2 shell变量的定义3.1.1 基本语法3.2.2 定义变量的规则3.2.3 将命令的返回值赋予变量 四、环境变量的设置4.1 基本语法&#xff1a; 五、位置参数变量5.1 基本介绍5.2 基本语法 六、预定义变量6.1 …

nginx的反向代理和负载均衡

nginx的反向代理和负载均衡&#xff1a; 代理&#xff1a;客户端通过一个指定的服务器&#xff0c;访问其他服务器&#xff0c;请求和响应都由指定服务器来为客户端进行处理&#xff0c;这个指定的服务器就是代理服务器 代理的方式&#xff1a; 四层代理&#xff1a;四层就是…

操作系统概述及发展史、Linux内核、发行版及应用领域

一、 操作系统&#xff08;Operation System&#xff0c;OS&#xff09; 裸机&#xff1a;没有安装操作系统的计算机 如果想在 裸机 上运行自己所编写的程序&#xff0c;就必须用机器语言书写程序如果计算机上安装了操作系统&#xff0c;就可以在操作系统上安装支持的高级语言…

python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图 下面代码可以驱动电脑接受声音数据&#xff0c;并实时展示音波图&#xff1a; import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import pyaudio import wave import os import op…

面试官:说说synchronized与ReentrantLock的区别

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

鱼香ROS一键安装命令(支持微信、docker、ros等)

按照指定的数字选择即可。 wget http://fishros.com/install -O fishros && . fishros小鱼的一键安装系列 [14个ROS版本任你选]一键安装Docker使用指南

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了&#xff0c;一些概念和操作已经模糊。 最近与人聊起SQL注入&#xff0c;重新翻阅&#xff0c;暂记于此。 重点&#xff1a;敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

力扣124. 二叉树中的最大路径和(java DFS解法)

Problem: 124. 二叉树中的最大路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经…

Nacos:现代微服务架构中的动态服务发现和配置管理

Nacos&#xff1a;现代微服务架构中的动态服务发现和配置管理 在当今快速发展的微服务架构中&#xff0c;服务的动态发现和配置管理成为了关键需求。Nacos&#xff0c;作为一个开源项目&#xff0c;应运而生&#xff0c;提供了一种高效、灵活的方式来处理这些挑战。本博客将深…

【C++】类和对象——const修饰成员函数和取地址操作符重载

在上篇博客中&#xff0c;我们已经对于日期类有了较为全面的实现&#xff0c;但是&#xff0c;还有一个问题&#xff0c;比如说&#xff0c;我给一个const修饰的日期类的对象 这个对象是不能调用我们上篇博客写的函数的&#xff0c;因为&d1是const Date*类型的&#xff…

备战春招——12.04 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_&#xff0c;完成映射操作&#xff0c;主要是相应的函数。map和set是有序的&#xff0c;使用的是树的形式&#xff0c;unordered_map和unordered_set使用的是散列比表的&#xff0c;无序。 相应函数…

【Java】类和对象之超级详细的总结!!!

文章目录 前言1. 什么是面向对象&#xff1f;1.2面向过程和面向对象 2.类的定义和使用2.1什么是类&#xff1f;2.2类的定义格式2.3类的实例化2.3.1什么是实例化2.3.2类和对象的说明 3.this引用3.1为什么会有this3.2this的含义与性质3.3this的特性 4.构造方法4.1构造方法的概念4…

【VRTK】【VR开发】【Unity】10-连续移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念&#xff0c;最早提出的时间是在2014年左右&#xff0c;随后一直处于上升期&#xff0c;随着前两年阿里、腾讯的相继入场&#xff0c;竞争逐步加大。低代…