C/C++软件工程师常见面试题(updating)

目录

1.C++源文件从文本到可执行程序的过程

 2.#include的顺序

3. #include<>和“”的区别

4. 进程与线程区别

 5.使用线程的优点

 6.malloc()实现方案

7.有了malloc()和free()为什么还要有new()和delete()

8. C++内存管理方式

9. hash表实现

10.TCP模型以及协议

11.进程间的同步方法

12.const的用途

13. 指针和引用的区别

14.Static作用

15.头文件中的endif/ifndef/define作用

16. TCP和UDP区别


 

1.C++源文件从文本到可执行程序的过程

  • 预处理,产生.ii文件
  • 编译,产生汇编.s文件
  • 汇编,产生目标.o/.obj文件
  • 链接,产生可执行.out/.exe文件

 2.#include的顺序

 若要在a.h中声明b.h中定义的变量,则在a.c文件中必须先引用b.h文件,再引用a.h文件

3. #include<>和“”的区别

  • <>表示标准头文件,编译器在预定义位置查找该文件
  • “”表示非系统头文件,查找从源文件所在路径开始,查找范围大于<>

4. 进程与线程区别

  • 资源:线程比进程节俭。启动新的进程需要分配独立的地址空间,建立数据表来维护代码段、堆栈段和数据段。
  • 切换效率:同一进程中的不同线程共享地址空间,线程彼此切换的时间远小于进程切换
  • 通信:线程之间共享数据空间,进行通信时,一个线程的数据可以直接由其他线程共享。而进程之间进行数据传递必须使用进程间的通信方式进行

 5.使用线程的优点

具有多任务、并发性的特点

  • 多CPU系统更加高效
  • 改善程序结构,长而复杂的进程可以分为多个线程,成为几个独立或半独立的部分,是的代码更易理解和修改。

 6.malloc()实现方案

  • 实质:将空闲的内存块链接起来的空闲链表
  • 调用malloc()函数后,顺序遍历空闲链表找到满足大小需要的空闲块,将多余的部分继续链入空闲链表
  • 调用free()函数,将用户释放的内存块连接到空闲链表上
  • malloc()请求延时,即将相邻的小空闲块合并为大的空闲块
  • 从OS角度,进程分配内存的两种方式分别由两个系统调用完成:brk和mmap。这两种方式均分配的是虚拟内存,并未分配物理地址。只有在第一次访问发生缺页中断时,才由OS分配物理内存并建立映射关系。  
  • brk将数据段的最高地址指针往高地址推
  • mmap是在进程的虚拟地址空间中(堆栈之间成为文件映射区域的位置)找空闲的虚拟内存

7.有了malloc()和free()为什么还要有new()和delete()

  • malloc()是C++/C语言的标准库函数,new/delete是C++的运算符,都可用于申请动态内存和释放内存。
  • 非内部数据类型的对象而言,光使用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,消亡前要自动执行析构函数。Malloc/free是库函数不是运算符,不在编译器控制权限内,不能够把执行析构函数和析构函数的任务交给malloc/free,故创造新的运算符
  • C++需要能够完成动态分配内存和初始化工作的运算符new,一个能完成清理和释放内存工作的运算符delete

8. C++内存管理方式

  • 栈(Stack):存放局部变量,函数参数,由编译器自动分配和释放。进出栈由计算机指令支持,分配有专门的寄存器存储栈的地址,内存空间连续有限。
  • 堆(Heap):程序员手动分配释放(new,delete),动态分配,内存空间无限制,因此产生内存碎片。OS中有记录空闲块的链表,收到内存请求即遍历链表找到第一个符合的空间进行分配,并将节点从链表中移除。在内存空间首地址中记录本次分配的大小,用于delete释放内存空间
  • 全局/静态存储区:全局变量和静态变量分配到该区,程序结束时自动释放,包括DATA(全局初始化区)段,BSS段(全局未初始化区)。初始化和未初始化的变量放到不同的区。BSS段在程序执行前自动清零,而DATA段在程序执行前已经为0
  • 文字常量区,存放常量字符串,程序结束后系统自动释放
  • 程序代码区,存放二进制代码

9. hash表实现

  • 散列函数hash function,最常见的为f(x)=x%tablesize
  • 碰撞问题,即不同元素的散列值相同。解决方法包括线性探测(依次后移),二次探测(用新的散列值再次散列),拉链法(直接链接在同一个地址上)

10.TCP模型以及协议

四层模型:

  • 应用层:Telnet、FTP和e-mail
  • 传输层:TCP和UDP
  • 网络层:IP、ICMP和IGMP
  • 链路层:设备驱动程序以及接口卡

11.进程间的同步方法

  • 互斥量(mutex)
  • 条件变量(Condition Variable)
  • 信号量(semaphore)

一般手写就是PV操作,对应的是wait()和signal()

12.const的用途

  • 定义只读变量即常量
  • 修饰函数的参数和函数的返回值
  • 修饰函数的定义体,被const修饰表示不修改成员变量的值

13. 指针和引用的区别

  • 引用是变量的别名,内部实现是只读指针
  • 引用只能在初始化时被赋值,其他时候值不能被改变,指针的值在任何时候都可以被改变
  • 引用不能为NULL,指针可以
  • 引用变量内存单元保存的是被引用变量的地址
  • “sizeof引用”=指向变量的大小,”sizeof指针”=指针本身的大小
  • 引用变量在源代码中当作普通变量使用,而作函数参数时,内部传递的实际上是变量地址

14.Static作用

  • 函数体内static变量作用范围为函数体,不同于auto变量,该变量的内存只被分配一次,因此下次调用时仍然维持上次的值
  • 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外的其他函数访问
  • 在模块内的static函数只可被这一模块内的其他函数调用,适用范围限定在声明的模块内
  • 在类的static成员变量为整个类所拥有,对类的所有对象只有一份拷贝
  • 在类的static成员函数为整个类所拥有,这个函数不接受this指针,因此只能访问类的static成员变量

15.头文件中的endif/ifndef/define作用

防止该头文件被重复引用

16. TCP和UDP区别

  • TCP传输控制协议,提供面向连接、可靠的字节流服务。客户和服务器彼此交换数据前,必须双方建立一个TCP连接,之后才能传输数据。且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据端到端传输。
  • UDP用户数据报协议,简单的面向数据报的传输层协议。不可靠,只负责把应用程序传给IP层的数据包发送数据,不保证到达目的地。由于不需要建立连接,且无超时重发机制,因此传输速度很快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值