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