阿里面经一面2022/9/19
1. strlen** 和 sizeof 的区别**
Strlen是函数在运行的时候才使用不读取’\0’
Sizeof是操作符,在定义编译的时候已经能算出值,包括’\0’
2. Typedef** 和 define 都是做别名的区别**
Define是预处理指令,在编译的时候不进行检查,只进行简单的替换。
#define 宏名 字符串
Typedefs C语言中用来复杂声明定义简单的别名,它本身是一种存储类的关键字
Typedef 旧名字 新名字
所以区别(1)格式(2)可以使用其他类型说明符对宏类型名进行扩展,而typedef不能这么做
3. Define** 运行的时候什么时候替换**
预处理
4. Static** 使用场景**
静态成员变量,静态成员方法,静态代码块,静态类等
5. 静态函数和普通函数的区别
静态函数不能被其他文件使用,其他文件可以定义相同名字的函数不会冲突,静态函数只在声明它的文件中可见,不能被其他文件所用
普通函数默认是extern,所以别的代码文件可以调用该函数
6. 静态全局变量和全局变量的区别
全局变量在全局区分配内存,未经初始化的静态全局变量会被程序自动初始化为0,在函数体内声明的自动变量值是随机的,除非被显式初始化,而在函数体外被声明的自动变量会被初始化为0,静态全局变量在声明它的整个文件可见,但是在文件外是不可见的
7. 静态类和普通类的不同
静态类和非静态类的重要区别在于静态类不能实例化,不能使用new关键字创建静态类类型的变量。
防止程序员写代码来实力该静态类,房子再累的内部声明任何实例字段或方法。
8. 静态变量和普通变量的区别
静态变量只能初始化一次,而普通变量可以初始化多次,静态变量只能在定义该变量的源文件内有效,普通全局变量在各个源文件中都是有效的
9. C** 和 C++ 编译过程的区别**
C语言中所有函数不能同名,而C++中函数时可以同名。
Gcc认为.c文件是C程序,.cpp为C++程序
G++认为.c文件是C++程序,.cpp为C++程序
C程序与C++程序中同样的函数在编译后的obj文件中的symbol是不同的,所以C方式编译的obj文件与以C++方式编译的obj文件无法成功链接
10. C++** 变成二进制文件的过程**
预编译、编译、汇编、链接
汇编是将汇编代码会变成机器指令
链接是将不同源文件生成目标代码以及其它目标代码,库文件组合,从而形成可执行程序。
11. 为什么不能直接编译成二进制文件
需要汇编,CPU不同 指令集不同 最后生成的机器码不同
12. New** 和 malloc 的区别**
New是运算符,malloc是库函数,malloc需要指定大小但是new不用,new用delete释放,malloc用free释放
13. 如何实现一个** malloc**
确定采用的数据结构,一个简单可行方案是将堆内存空间以block的形式组织起来,每个块由meta去和数据区组成,meta区记录数据块的元信息(数据区大小,空闲标志位,指针等等),数据区是真实分配的内存区域,并且数据区的第一个字节地址,即malloc返回的地址
- 寻找合适的block ,指针查找,如果找到第一个合适的块就直接返回,找不到的话再下一步
- 开辟新的block,链表最后开辟一个新的block
- 分裂block,如果发现某个块剩余的数据区足够大,那么就将它分裂
14. 计算机** 32 位和 64 **位的辨别
支持的内存容量不同,支持的运行软件不同
15. 哈希表的实现
可以采用两种方法
1.数组+链表,通过key获得数组位置,冲突的时候链地址法,连在后面
2.数组+二叉树,因为如果冲突很多的时候这是的哈希表还用链表链接的话访问效率低所以用二叉树,这样就可以到达logn
16. Vector** 和 list 的区别**
底端实现不同,vector是数组,list是链表,抽取的时候vector可以O(1)但是list因为是链表所以是O(n)