C++面试题总结

1、debug和Release的区别

Debug:调试版本,包含调试信息,所以容量比Release大,不对程序进行优化,会生成.exe和.dll文件,还有.pdb文件(记录中断调试信息)
Release:发布版本,编译时对应用程序进行优化,以便用户很好使用

2、内存分配的方式—静态内存、栈内存、堆内存

从静态存储区分配:编译时分配,程序运行时都存在,全局变量,static变量、常量在这里存储
在栈区分配:代码执行时创建,执行结束自动释放。栈内存分配运算内置于处理器,效率高,容量有限
在堆区分配:动态分配内存。程序员自己new和delete,使用灵活,如果不回收,运行会出现内存泄漏,频繁分配和释放不同大小的堆空间会产生堆内碎块。

3、C++中堆(heap)和栈(stack)的区别

在C++中,内存分为五区:堆,栈,自由存储区、全局/静态存储区、常量存储区。
:编译器在需要时自动分配,不需要时自动清除,存放局部变量、函数参数
:new分配的内存快,由程序员自动释放(编译器不管),如果程序员不释放,资源将在操作系统结束后自动回收(Java自动回收机制)。
自由存储区:malloc分配的内存块,free来释放,和堆相似
全局/静态存储区:存放全局变量和静态变量
常量存储区:存放常量,不允许修改。
自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆

管理方式 堆中资源由程序员控制 栈资源由编译器自动管理,无需手工控制
内存管理机制 系统有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆结点,删除空闲结点链表中的该结点,并将该结点空间分配给程序 只要栈的剩余空间大于所申请空间,系统为程序提供内存,否则报异常提示栈出
空间大小 堆是不连续的内存区域(系统是用链表来存储空闲内存地址,不是连续的),堆大小受限于计算机系统中有效的虚拟内存(32bit 系统理论上是4G),堆的空间比较灵活,比较大 栈是一块连续的内存区域,大小是操作系统预定好的
碎片 对于堆,频繁的new/delete会造成大量碎片,使程序效率降低 对于栈,它是一个先进后出的队列,进出一一对应,不会产生碎片。
生长方向 堆向上,向高地址方向增长。 栈向下,向低地址方向增长。
分配方式 堆都是动态分配 栈有静态分配和动态分配,静态分配由编译器完成(如局部变量分配)

4、变量的声明和定义的区别

定义:为变量分配地址和存储空间,只在一个地方定义。
声明:不分配地址,具体使用时才初始化,分配内存空间,一个变量可以多次声明。

5、sizeof和strlen的区别

  • sizeof是一个操作符,strlen是库函数
  • sizeof的参数可以是数据类型,也可以是变量
  • sizeof在编译时就计算出结果,strlen函数必须在运行时才能计算出来,而且strlen计算的是字符串的实际长度

6、typedef和define的区别

  • typede用来定义一种数据类型的别名,增强程序的可读性;define主要用来定义常量和书写复杂使用频繁的宏。
  • typedef 有作用域限定。define 不受作用域约束
  • typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。

7、链表和数组的区别

  • 存储形式:数组是一块连续的空间,声明要确定长度;链表是一块可不连续的动态空间,每个节点要保存相邻结点指针
  • 查找:数组遍历速度快
  • 插入和删除:链表可以快速插入和删除结点,数组需要大量数据移动
  • 越界问题:链表不存在越界问题

你可能感兴趣的:(学习,c++)