当前位置: 首页 > >

C/C++开发工程师笔试与面试题备忘(持续更新中)

发布时间:



文章目录
基础LinuxLinux系统Linux函数I/O复用多进程多线程IPC通信
Linux使用与命令Linux下常用软件
CC++C++基础类staticconst的用法inlinetypedef和define引用
STL虚函数面向对象思想
TCP协议HTTP协议高并发MySQLRedis数据结构与算法数据结构算法排序算法链表树动态规划其他算法

设计模式



基础
Linux
Linux系统

中断的概念:
SIGPIPE和SIGINT


Linux函数
I/O复用

select的使用和原理




epoll的使用和原理



阻塞和非阻塞


同步与异步


多进程

fork函数的返回值
僵尸进程和孤儿进程,怎么预防和处理


多线程

线程的创建
如何确定一个进程应该开多少线程



IPC通信

不同IPC通信方式的优缺点和应用场景:



条件变量



Linux使用与命令

Linux 发行版本与内核版本




Linux*羰О茉蚍治




包安装方式




LVM




ssh与telnet的区别




查看日志末尾
输出到文件



Linux下常用软件

gdb如何调试多线程:



valgrind:内存泄漏检查工具
gprof:代码性能检查工具



C

预处理包含三方面的内容:宏定义与宏替换、文件包含、条件编译。



用%x打印字符数组




scanf的使用




会导致coredump的情况:
函数返回局部变量




函数指针与指针函数
数组指针与指针数组
常量指针与指针常量




float精度的判断
fabs()
pow



内存管理与释放
内存布局:栈堆全文代。
堆和栈的区别
栈区由编译器自动分配释放。其操作方式类似于数据结构中的栈,速度较快。
堆区由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。其分配方式类似于链表,一般速度较慢。容易产生内存碎片。堆上分配内存,在C中使用malloc,在C++中使用new。


malloc/free与new/delete的区别
①操作对象不同。前者是标准库函数,不在编译器控制权限之内。后者是C++的运算符,除了分配释放空间外,还会调用构造或析构函数。
②用法不同。malloc返回的是void*,因此是类型不安全的,而且malloc且需手动计算要申请的内存字节数。而new内置了sizeof、类型转换和类型安全检查功能,无需手动计算。另外注意如果使用new创建对象数组,那么只能使用对象的无参构造函数。


内存泄漏的定义与确定:


野指针


C++
C++基础

空类中自带的函数:


static

不考虑类,static的作用主要有三条:
①隐藏:即对其他源文件隐藏;
②默认初始化为0:包括未初始化的全局静态变量与局部静态变量。另外未初始化的全局变量也具备这一属性。这是因为全局变量和静态不买单都存储在BSS段(即全局静态区);
③保持局部变量内容的持久:即在对应函数中可持续使用。


类中static的作用:属于一个类但不属于此类的特定对象。
静态数据成员:必须在类外定义并初始化,对于const static数据成员,可以在类的定义体中初始化,但仍需在类外进行定义(只是此时无需初始化)。
静态成员函数:通过类名调用。不具有this指针,因此无法访问非静态数据成员和非静态成员函数。不能被声明为const、虚函数、volatile。


全局变量与静态变量的异同:


const的用法

C与C++中的const的区别
在C中,默认const是外部连接的;而在C++中,const全局变量对其他源文件隐藏,如果要被其他文件访问,需使用extern修饰。


指针常量:*p为const;
常量指针:p为const。


指针常量const int* p;常量指针int * const p = &d;

在C++中使用const而非使用#define的原因:
①const常量有类型,编译器可进行类型安全检查;
②使用const常量可能导致更小的目标代码,因为#define是盲目地替换;
③const可以执行常量折叠(即将常量表达式计算求值)。


const修饰函数参数与返回值
①const修饰函数返回值;
②const修饰函数参数:常用于const引用。


const在类中的使用
①const修饰成员函数:const对象(或指向该对象的指针、引用)只能调用const成员函数;
②const修饰数据成员:此时必须在构造函数的成员初始化列表中进行初始化。


inline

inline函数与宏定义的区别:


typedef和define
引用

指针和引用的区别:


STL

容器类型和各自特点



迭代器与指针的区别


deque的使用:


内存池的实现


虚函数

多态的实现



重载、覆盖、隐藏的区别:


virtual关键字的用法。



构造函数中使用虚函数
基类的析构函数为何要设置为虚函数?




虚函数的实现



面向对象思想

抽象类和接口类的区别



面向对象编程的基本原则



TCP协议

TCP通信过程:
三次握手、四次挥手图解
TCP通信状态转移图




Linux下客户端和服务器端建立TCP通信使用到的函数



HTTP协议
高并发

怎么提高服务器的并发处理能力:
A. 提高CPU并发计算能力
(1)多进程&多线程
(2)减少进程切换,使用线程,考虑进程绑定CPU
(3)减少使用不必要的锁,考虑无锁编程
(4)考虑进程优先级
(5)关注系统负载
(6)关注CPU使用率,除了用户空间和内核空间的CPU使用率以外,还要关注I/O wait
B. 减少系统调用的使用
C. 考虑减少内存分配和释放
(1)改善数据结构和算法复杂度
(2)使用内存池
(3)考虑使用共享内存
D. 考虑使用持久连接
E. 改进I/O模型
(1)DMA技术
(2)异步I/O
(3)改进多路I/O就绪通知策略,epoll
(4)sendfile
(5)内存映射
(6)直接I/O
F. 改进服务器并发策略
(1)一个进程处理一个连接,非阻塞I/O,使用长连接
(2)一个进程处理多个连接,异步I/O, 使用长连接


MySQL

C++使用到的MySQL库:mysqlclient库


MySQL端口号:3306


MySQL基础语句、嵌套语句的使用。


获取一个表的前N条记录。


数据库索引怎么建立,索引的优缺点:


如何提高数据库查询速度?有哪些优化技巧?


事务的特性ACID


Redis

C++使用到的Redis库




Redis的基本数据类型和操作



数据结构与算法
数据结构

单链表与双链表




红黑树特性




栈的应用:
用于四则运算




队列的应用:
用于输出倒数n行



算法
排序算法

冒泡排序、交换排序、选择排序
快排
堆排



链表

判断链表是否有公共节点。
判断链表是否有环。
链表的增删。
查找链表倒数第k个结点。



二叉排序树和链表的转换


二叉树的前中后序非递归代码


*衡二叉树的基本概念
线索二叉树的基本概念
红黑树的基本概念


动态规划

BFS




DFS




最长子序列



其他算法

用数组实现大数乘法




实现一个string类




实现一个动态数组



设计模式

常用的设计模式




友情链接: 时尚网 总结汇报 幼儿教育 小学教育 初中学习资料网