一面
C++,C和python的区别?
C和C++是编译型语言,python是解释型语言。编译型和解释型,在编程时的最大区别是必不必要写一个入口函数,在C语言里是 main,而 Python 可以不写。
编译型的优点是“静态”,代码不能一行一行编译执行,必须作为整个工程来编译,这样便于类型检查,降低运行时错误率;运行时效率更高,因为编译器可以统筹各个方面,生成更优化的机器指令;一经编译便可直接以机器语言再次执行。
解释型语言的优点是“动态”,代码的每一行可独立执行(代码块除外)。这样就可以灵活地进行实时交互,调整正在运行的程序,进行实时、异步的调试。比如 Python 的 CLI(命令行交互界面)就可以直接输入 Python 代码执行。
C,C++ 是弱类型、静态类型检查的,Python 是强类型、动态类型检查的。
强类型:偏向于不容忍隐式类型转换
弱类型:偏向于容忍隐式类型转换
静态类型: 编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。
动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。
c/c++ -> bin,中间经历了哪些过程?介绍每个过程,以及优化的时候在什么过程优化?
源代码-->预处理-->编译-->优化-->汇编-->链接–>可执行文件
预处理:读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。宏定义指令;条件编译指令;头文件包含指令;特殊符号。 预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件
编译:经过预编译得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,\,等等。预编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
优化阶段。优化阶段在编译阶段做。经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。
extern关键字的作用?
- extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
- extern C表示此段代码使用C语言的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。具有函数名匹配的功能。
static关键字的作用
- 函数中的静态变量。当变量声明为static时,空间将在程序的生命周期内分配。
- 类中的静态变量。声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享。它是属于类的。静态变量不能使用构造函数初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化。类中的静态变量应由用户使用类外的类名和范围解析运算符显式初始化
- 类对象为静态。对象也在声明为static时具有范围,直到程序的生命周期。
- 类中的静态成员函数。允许静态成员函数仅访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。建议使用类名和范围解析运算符调用静态成员。
volatile
当对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为volatile。关键字volatile告诉编译器不应对这样的对象进行优化。编译器每次应该从内存中取对象的值,而不是从缓存中读取。
二面
代码题:单链表反转,需要自己写输入输出。
单链表和双向链表的区别?
单链表只有一个指向下一结点的指针。
双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,可以快速找到前一结点。
代码调试工具GDB是否使用过?
Linux常用命令有哪些?
数组和链表的区别?
数组:随机访问性强、查找速度快、插入和删除效率低、可能浪费内存、内存空间要求高,必须有足够的连续内存空间。
链表:插入删除速度快、内存利用率高,不会浪费内存、大小没有固定,拓展很灵活。不能随机查找,必须从第一个开始遍历,查找效率低。
数组大小固定,不能动态拓展
结构体内存对齐,计算结构体的大小
struct {
int a;
char b;
int d;
short c;
//int d;
}
内存对齐的默认规则,平台的默认对齐系数, #pragma pack(n) , n = 1,2,4,8,16。
有效对齐值:给定对齐系数和结构体中最长数据类型中较小的那个。有效对齐值也叫对齐单位。
对齐规则1(数据对齐):结构体的第一个成员的偏移量是0,以后每一个成员相对于结构体首地址的偏移量都是该成员大小与有效对齐值中较小的那个值的整数倍。如果有需要的话会在成员之间加上填充字节。
对齐规则2(结构体对齐):结构体的总大小必须为有效对齐值的整数倍,如果有需要,编译器会在最末一个成员之后加上填充字节。