(C++算法工程师考点总结)基础

1、源程序是如何被编译成可执行的二进制程序的

在这里插入图片描述
预处理: 在程序编译之前,由预处理器对C++源程序完成预处理工作。预处理主要将源程序中的宏定义指令、条件编译指令、头文件包含指令以及特殊符号完成相应的替换工作。(该步骤不进行语法检查,这就是inline函数比宏定义安全的原因)
编译器: 以预编译的输出作为输入,利用C++运行库,通过词法分析和语法分析,在确认所有的指令都符合语法规则时,将其翻译成等价的中间代码表示或是汇编语言(.s 文本文件)
汇编器: 将以汇编语言的形式存在的程序转化为机器可识别的二进制代码(.o 二进制文件)
链接器: 经过汇编器之后的目标文件仍然是不可执行的,因为缺乏程序运行必须的动态链接库(.dll)和静态链接库(.lib),链接器就是将程序所引用的外部文件关联起来,形成 .exe 后缀的可执行文件。

2、动态链接库和静态链接库

静态链接库和动态链接库都是共享代码的方式。
静态链接库:
如果采用静态链接库,则无论你愿不愿意,lib中的指令都全部被直接包含在最终生成的EXE文件中。
静态链接库中不能包含其他的静态链接库或者动态链接库。
动态链接库:
若使用动态链接库,该DLL不必被包含在最终的EXE文件中,EXE文件执行时,可以“动态地”引用和卸载这个与EXE独立的DLL文件。
动态链接库中可以继续包含其他的静态链接库或者动态链接库。

3、C/C++程序的内存分配情况

由C/C++编译的程序占用的内存分为以下几个部分:

  1. 栈区(stack):由编译器自动分配释放,存放的是函数的局部变量、函数参数、返回数据、返回地址等。当函数执行完毕之后自动释放。其操作方式类似于数据结构中的栈。
  2. 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束后由OS负责回收。分配方式类似于链表。
  3. 全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放。
  4. 文字常量区:常量字符串存储的区域。程序结束后由系统释放。
  5. 程序代码区:存放函数体(类成员函数和全局函数)的二进制代码。

4、new 和 malloc 的区别

  1. new/delete 是 C++ 中的操作符,malloc/free 是 C/C++ 语言的标准库函数。
  2. new 不止是分配内存,而且会调用类的构造函数,同理 delete 会调用类的析构函数,而 malloc 则只分配内存,不会进行初始化类成员的工作,同样 free 也不会调用析构函数。
  3. 用法不同:
    malloc返回的是(void*)类型的指针,所以需要进行强制类型转换,如:
    int *p = (int *)malloc(sizeof(int) * length);
    new 的使用则相对比较简单,直接可以使用:
    Obj *objects = new Obj[100];
  4. 内存泄漏时,new 和 malloc 都可以检查出来,但是new可以指明具体是哪个文件的哪一行出现了内存泄漏。
  5. malloc 申请空间的原理:
    malloc 可以将可用的内存块连接为一个长长的列表,所谓空闲列表。调用malloc函数时,它沿着连接表找到一个足以满足用户需求的内存块,然后将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存块连接传给用户,并将剩下的那块返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。最后,空闲链会被切分成很多小的内存片段。

5、内联函数和宏定义的差别?

  1. 内联函数在编译时展开,宏在预编译时展开。
  2. 编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数一样),而宏定义不会。
  3. 内联函数可以访问类的成员变量,宏定义则不能。
  4. 在类中声明同时定义的成员函数,自动转化为内联函数(即如果类的成员函数是在类内部定义的,则不需要在函数定义之前加inline,该函数就自动转为inline函数)。
  5. 内联函数是直接嵌入到目标代码中,而宏是做简单的文本替换。

内联函数和普通函数相比,可以加快程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接被嵌到目标代码中。对于短小的代码来说,inline可以带来一定的效率提升,而且和宏定义相比,inline更可靠安全。但是这是以增加空间消耗为代价的。inline一般只用于如下情况:

  1. 一个函数不断被重复调用。
  2. 函数只有简单的几行,且函数不包含for、while、switch语句。

一般来说,我们写小程序没有必要定义成inline,但是如果是要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline。

你可能感兴趣的:(C++,面试)