问题总结

一、C/C++

(一)特性

1、继承、封装、多态

2、C++与C对比

(二)关键字

1、static、extern

2、const

3、volatile

(三)编译

1、C++源文件从文本到可执行文件经历的过程?

        预编汇链

(1)预编译阶段:处理 #include、#define、 #if。包含头文件、替换宏、明确条件编译内容。生成预编译文件(.i),字符文件。

(2)编译阶段:编译预编译文件,生成汇编文件(.s),字符文件。

(3)汇编阶段:将编译文件转换成机器代码,生成目标文件(.o),机器代码。

(4)链接阶段:插入启动代码,将链接库文件和汇编后的目标文件链接为一个可执行文件(.exe/linux不确定)。

(四)内存管理

1、C++的内存管理

        在C++中,虚拟内存空间分为:代码段、数据段、bass段、堆区、共享库的内存映射区、栈区。T-DB-HMS

(1)代码段(text):包括 文本区、只读存储区。文本区——存放程序机器代码,只读存储区——存放字符串常量。

(2)数据段(data):存放初始化的 全局变量、静态变量。在编译阶段已经分配好内存,占用编译好的文件的内存。

(3)bass段(bass):存放未初始化 / 初始化为0的 全局变量、静态变量。在运行阶段开始时才分配内存,不占用编译好的文件的内存。

(4)堆区(heap):在程序运行期间,通过 new / malloc 动态分配的内存。可以动态扩展或收缩,向上增长,向下收缩。

(5)共享库的内存映射区(memory mapping segment):存放共享的代码和数据,如C标准库,数学库,动态链接库。

(6)栈区(stack):又称用户栈,实现函数调用,调用时栈增长,返回时栈收缩。可以动态扩展或收缩,向下增长,向上收缩。linux可以通过 ulimit 命令来临时执行进程的栈的大小。

        代码段(text)—— 只读代码和数据

        数据段(data)、bass段 —— 可读可写数据

2、堆与栈的对比

(1)分配和回收

         堆(heap):在程序运行期间,用户通过 new / malloc 动态分配的内存。需要用户使用 delete / free 主动释放。

         栈(stack):在程序运行期间,编译器 在调用函数时 分配的内存,调用时栈增长,返回时栈收缩。保存函数调用信息,包括 函数的返回地址、局部变量、参数、返回值等。由编译器自动回收内存。

(2)动态增长

         堆栈都可以在运行期间动态增长和收缩。栈,向下增长,向上收缩。堆,向上增长,向下收缩。

(3)执行效率

         栈的分配和回收速率更快。堆使程序更加灵活。

3、new 和 malloc 的区别

(1)分配方式、返回值

         new 通过 指定的数据类型 分配内存,分配了一个 动态对象,返回的是 动态对象的指针

         malloc 通过 指定的大小 分配内存,分配了一块 空类型内存,返回的是 泛型指针,因此一般需要类型转换

(2)构造、析构

         new 会调用构造函数,delele 时会调用析构函数。申请、销毁数组时,会多次调用构造、析构。

         malloc、free 不会。

(3)函数本质

         new 是一个操作符可以重载,malloc 是一个库函数。

(4)失败处理

         new 如果分配失败了会抛出 bad_malloc 的异常,

         malloc 失败了会返回 NULL。

(5)分配扩容

         malloc 分配的内存不够的时候,可以用 realloc 扩容。扩容的原理?new没用这样操作。

4、malloc、calloc、realloc 的对比

(1)函数原型

    void *malloc ( size_t size );             总大小

    void *calloc ( size_t num_elements, size_t element_size );       数量 * 大小

    void *realloc (void *ptr, size_t new_size );     原地址,新大小。返回新地址

(2)分配方式

        malloc 按 总需大小 直接分配。

        calloc 按 元素数量元素大小 进行分配,并且会对它初始化为0

        realloc 修改 已分配的内存块 的大小,可使内存块 扩大或缩小。

                    当传入空指针时,相当于 malloc。

                    当 新大小 比 原大小 小时,收缩内存块。

                    当 新大小 比 原大小 大时,扩大内存块。若不能在原来位置上扩容,则在其他位置重新分配一块内存。

5、如何避免内存泄漏 memory leak

(1)程序员要养成良好习惯,保证malloc/new和free/delete匹配,释放之后指针置空;

(2)在用户程序与运行库之间加了一层,用于记录内存分配情况。

6、如何处理内存泄漏

        使用 varglind,mtrace 检测。

7、如何避免内存碎片的产生

(1)少使用动态分配。少用动态内存分配的函数(尽量使用栈空间)。

(2)少进行内存分割。不要反复申请小内存,尽量一次性申请较大的内存2的指数次幂大小的内存空间。

(3)使用内存池。也就是自己一次申请一块足够大的空间,然后自己来管理,用于大量频繁地 new / delete 操作。

(4)分配内存和释放的内存尽量在同一个函数中。

(五)STL库

 

 

 

 

二、操作系统

1、各种api

2、进程的状态

3、进程死锁、产生死锁的原因、处理死锁的方法

4、进程 / 线程,通信、同步

5、进程与线程的区别

6、操作系统的发展及其特点

单道批处理、多道批处理、分时系统、时时系统

7、锁:互斥锁、读写锁、自旋锁

 

三、数据库

1、概念:事务、视图、索引、约束、权限、角色、用户

2、连接:自连接、内连接、外连接、满连接

3、事务的基本特征:原子性、隔离性、一致性、持久性

4、事务的隔离级别:读未提交、读已提交、可重复读、串行读

5、数据不一致性:脏读、不可重复度、幻读

 

四、网络编程

1、select

2、poll

3、epoll

4、epoll 水平触发、边沿触发

5、TCP/IP三次握手、四次挥手、Timeout

6、TCP/IP如何保证可靠传输

7、TCP与UDP的对比

8、TCP特点

TCP所提供服务的主要特点:1.面向连接的传输;2.端到端的通信;3.高可靠性,确保传输数据的正确性,不出现丢失或乱序;4.全双工方式传输;5.采用字节流方式,即以字节为单位传输字节序列;6.紧急数据传送功能;

9、滑动窗口

10、应用层协议

基于TCP的应用层协议有:SMTP、TELNET、HTTP、FTP

基于UDP的应用层协议:DNS、TFTP(简单文件传输协议)、RIP(路由选择协议)、DHCP、BOOTP(是DHCP的前身)、IGMP(Internet组管理协议)

五、数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值