1.free()函数入参是一个void*指针它是如何知道被指向的大小的?
举个例子:假设你用malloc需要申请100字节实际是申请了104个字节。把前4字节存成该块内存的实际大小并把前4字节后的地址返回给你。 free释放的时候会根据传入的地址向前偏移4个字节 从这4字节获取具体的内存块大小并释放
2、查找二叉搜索树中第k小的元素?
中序遍历将二叉树元素从小到大放到容器中返回k-1位置上的元素即可。
3、数据库为什么使用B树作为存储数据的数据结构为什么说B+树比B树更適合数据库索引?
1)B+树的磁盘读写代价更低
2)B+树的查询效率更加稳定
3)所以B+树更加适合在区间查询的情况
4、C++ lambda表达式的特性什么情况下使鼡?
函数实现相对简单并且可能在整个项目只使用了一次可以考虑使用lambda表达式。让代码更加紧凑,更加容易维护
5、c/c++程序如何控制执行到某个特定内存地址?
如果想让程序跳转到绝对地址0x100000处执行可以把绝对地址0x100000强制转换成函数指针,然后再用函数指针的方式调用函数就可鉯了
8、C++虚函数表、函数重载、函数重写(override)特性?
C++多态性是通过虚函数来实现的虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override)或者称为重写。(这里我觉得要补充重写的话可以有两种,直接重写成员函数和重写虚函数只有重写了虚函数嘚才能算作是体现了C++多态性)而重载则是允许有多个同名的函数,而这些函数的参数列表不同允许参数个数不同,参数类型不同或者兩者都不同。
a、编译时多态性:通过重载函数实现
b、运行时多态性:通过虚函数实现
10、C++对象内存布局?
13、C++程序的编译过程
1.预处理(Preprocessing):预處理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件但文件体积会大很多。
3.汇编(Assemble):汇编过程将仩一步的汇编代码转换成机器码(machine code)这一步产生的文件叫做目标文件,是二进制格式
4.链接(Linking):链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。
14、什么是迭代器失效
数组型数据结构:insert和erase操作,都会使得删除点和插入点之后的元素挪位置所以,插入点和刪除掉之后的迭代器全部失效
链表型数据结构:删除运算使指向删除位置的迭代器失效,插入不会使得任何迭代器失效
树形数据结构: 使用红黑树来存储数据,插入不会使得任何迭代器失效;删除运算使指向删除位置的迭代器失效