本文主要是介绍【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
以上是一般情况下的步骤,具体的细节可能会因操作系统、编译器和开发环境的不同而有所变化。在使用特定工具和平台时,请查阅相关文档以获取详细信息。
- 给定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);}
这篇关于【Q4-20min】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!