目录
7.有了malloc()和free()为什么还要有new()和delete()
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层的数据包发送数据,不保证到达目的地。由于不需要建立连接,且无超时重发机制,因此传输速度很快。