C++面试小题二

主要是去了解自己未曾深入去思考的问题,比如volatile,动态绑定等

volatile关键字作用

  • 被设计用来修饰被不同线程访问和修改的变量,每次从内存中读取数据,而不是从编译优化后的缓存中读取数据。
  • 遇到这个关键字声明的变量,编译器对访问该变量的代码不在优化,从而可以提供特殊地址的稳定访问
  • 优化器在用这个变量时必须每次都要消息地重新读取这个变量的值,而不是使用保存在寄存器里的备份
  • 防止共享的空间发生读取的错误,防止编译器优化,

volatile使用的地方

  • (1)并行设备的硬件寄存器(如:状态寄存器)

  • (2)中断服务程序中修改的供其它程序检测的变量需要加volatile;

  • (3)多任务环境下各任务间共享的标志应该加volatile;

  • (4)存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

    虚函数表

  • 虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针

  • 虚表内的条目,即虚函数指针的赋值发生在编译器的编译阶段

  • 虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表。同一个类的所有对象都使用同一个虚表

动态绑定

  • 经过虚表调用虚函数的过程称为动态绑定,其表现出来的现象成为运行时多态。
  • 传统函数的调用成为静态绑定,即函数的调用在编译阶段就可以确定下来

什么时候会执行函数动态绑定

  • 通过指针来调用函数
  • 指针upcast向上转型
  • 调用的是虚函数

参考文献