0%

1.类型

1.1 基本内置类型

基本内置类型有算术类型和空类型。算术类型分两类为整型和浮点型,下图显示了C++的算数类型:

1.2 复合类型

c++有几种复合类型:数组、结构、string、引用和指针。这里讨论引用和指针。

阅读全文 »

1. 面向对象

相比于c++,python中的OOP理解和使用都较简单,其把隐藏的的语法杂质和复杂性都去掉了。 ## 1.1 类对象提供的默认行为 在python的面向对象模型种,要分清类对象实例对象。类对象就是class定义了一个类只会,该类提供些行为就是类对象.而实例对象就是该类的实例。每次调用类,就会生成一个实例。 类对象提供的默认行为:

  • class语句创建类对象并将其赋值给变量名。就像def一样,class语句也是可执行语句,执行时会产生类对象,并赋值变量名
  • class语句的赋值语句会创建类属性,像模块文件一样,class语句内的顶层的赋值语句(不在def内)会成为类对象的属性。
  • 类属性提供对象的状态(变量)和行为(函数)
  • 类仍然时模块内的属性。当class执行时,只是赋值语句而已,赋值了一个类对象
阅读全文 »

1. python的运行过程

1.1 字节码编译

当程序运行时,Python内部会将源代码(.py文件中的程序)编译成所谓的字节码的形式,就是将每一行源代码语句从上到下翻译过来,翻译成一组字节码的指令.这些字节码可以提高执行速度;比起源代码语句,字节码要执行快的多。

阅读全文 »

1. C++知识面试版_基础

1.1 编译过程

如上所示,一个c源文件会先经过预处理,将头文件展开、宏替换和去注释;然后经过编译器生成汇编文件,再有汇编器生成二进制文件,最后再经过链接器将函数库中相应的代码组合到目标文件

  • 预处理:预处理器会扫描源代码文件,根据以“#”开头的预处理指令执行一些文本替换和文件包含操作。例如,预处理器会把所有的#include指令替换为对应的头文件内容,并将定义的宏展开。生成.i文件

  • 编译:编译器将经过预处理的源代码文件翻译成汇编代码,这是一种与具体机器体系结构相关的低级代码。生成.s文件

  • 汇编:汇编器将汇编代码转化为机器码,并生成一个目标文件(.obj 或 .o)。目标文件包含机器指令和一些元数据,如符号表和重定位信息。生成二进制.o文件

  • 链接:链接器将目标文件与系统库和其他目标文件链接在一起,生成可执行文件。链接器主要完成两个任务:解析符号引用和地址重定位。
    • 符号解析:每个符号对应一个函数、一个全局变量或一个静态变量,符号解析的目的就是将每个符号引用正好和一个符号定义关联起来。那么当然在不同目标文件中引用的同一全局变量或函数,链接器需要将其解析为同一个实体。
    • 地址重定位指的是在链接过程中,需要将不同目标文件中的函数和变量的地址进行调整,使得它们在最终的可执行文件中能够正确地链接到一起。生成可执行文件

1.2 静态链接和动态链接

1.2.1 静态链接:

链接器将目标文件和库文件的代码和数据全部拷贝到可执行文件中,形成一个独立的、包含所有必需代码和数据的可执行文件。在运行时,可执行文件不需要依赖外部库文件,所有需要的代码和数据都已经包含在可执行文件中

  • 优点:对运行环境的依赖性较小,具有较好的兼容性,方便分发和部署,不需要外部依赖
  • 缺点:生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间;库函数有了更新,必须重新编译应用程序
1.2.2 动态链接

在动态链接中,库文件的代码和数据被保留在一个独立的文件中,被多个可执行文件共享。在链接时,链接器会将可执行文件中需要的库函数和数据的引用替换为动态链接库的符号表中对应的地址。在运行时,当程序调用一个需要动态链接库中的函数时,操作系统会将对应的库文件加载到内存中,并将调用转向库文件中的函数

  • 优点:在需要的时候才会调入对应的资源函数;简化程序的升级;可执行文件小,节省磁盘空间;同时多个可执行文件可以共享同一个库文件,减少了内存占用
  • 缺点:依赖动态库,不能独立运行;动态库依赖版本问题严重。如果库文件版本或路径发生变化,可能会导致程序无法正常运行

注:前面我们编写的应用程序大量用到了标准库函数,系统默认采用动态链接的方式进行编译程序,若想采用静态编译,加入-static参数。

1.2.3 运行是加载和链接共享库
阅读全文 »