1.结构体对齐的问题

数据在计算机中一般是以8字节的整数倍为一个存储单元来存储的,而结构体中包含的各种数据类型并不一样长,结构体的总大小可能是5字节或是7字节等等。计算机一次只能存取整数个存储单元的数据,所以无论是5字节的数据还是8字节的数据,计算机都要存取两次。综上,结构体对齐可以方便计算机存取数据,减轻I/O压力。
那么,对齐的结构体的大小怎么计算呢?用以下两条的规则确定:(一)前面的单元的大小必须是后面单元大小的整数倍,如果不是就补齐。

(二)整个结构体的大小必须是最大字节的整数倍
相关知识:计算机组成原理
2.static关键字的解释
(一)在c语言中

  定义在函数内部的static型的变量的值不会在函数调用后消失,而是会被保留。定义在函数外部的static只在文件内可视。
  解释:函数内部的局部变量、函数参数,是放在系统栈内的,随着调用结束,栈中的数据会消失,所以函数内部的局部变量的值会随着函数调用结束而消失。但static型的变量放在静态区(全局变量也放在这里),不会随着函数调用结束而被丢弃。

(二)在C++中

  static的作用主要有(1)隐藏(函数/变量均可)(2)确保变量的生存期(记忆功能和全局生存性)(3)默认初始化为0。
  (4)静态全局变量不会被外部文件所用(即私有化),普通全局变量可以被外部文件使用。
  特别的,对C++中的类使用static关键字,有以下特征:
  (一)static静态成员函数属于类,而不是属于某个对象。
  (二)由于(一),static静态成员函数没有this指针,只能访问静态成员函数和静态成员变量。反过来,非静态成员函数可以访问静态成员函数和静态成员变量。
  (三)不能把静态成员函数定义为虚函数。
  (四)static不能继承,virtual隐性继承。
  (五)静态成员变量要初始化
  (六)static不增加额外时空开销,可以方便地用于子类和父类的通信。
  (七)在类外初始化,不加权限修饰符,一般格式为:<数据类型><类名>::<静态成员名>=<val>

3.隐藏、覆盖与重载的区别

 覆盖:指子类覆盖父类函数。
 特征:(1)分别位于子类和父类中
 (2)函数名字和参数要相同
 (3)父类的函数是虚函数
 隐藏:子类屏蔽了父类的同名函数(与参数列表无关)
 特征(满足其一即可):
 (1)子类父类函数同名,但参数列表不同
 (2)父类没virtual,子类父类函数同名且参数列表相同
 重载:在同一个访问区内被声明的几个同名函数,按照其参数列表,编译器决定调用哪个函数。被重载的函数可以被virtual修饰,也可以不被virtual修饰。

4.extern关键字解释

 (一)告诉编译器这个模块或者函数,定义在别的文件中。
 (二)与“C”连用时,表示按照C的规则去翻译

5.const关键字解释

 限定一个变量不允许改变,产生静态作用。节省空间,编译器不为const分配内存,而是放在符号表中,使其成为一个编译期间存在的常量,没有存储和读内存的操作,效率比较高。另外,由于const是一个常量,可以保护一些内容。
 const定义常量,只是给出了对应的内存地址,而#define则是给出了立即数。所以const常量在程序运行过程中只有一份拷贝,而#define定义在内存中有若干份拷贝。

6.内联函数与宏定义

内联函数是由inline关键字声明的函数,是C++的一个特殊的函数,它建议编译器将函数体直接插入函数调用处,而非通过函数调用机制调用,在编译阶段完成。
宏定义是在预编译阶段完成,要给能加括号的东西都加括号。

7.左值和右值

左值:代表一个在内存中占有确定位置的变量。
右值:非左值。

8.C++的多态性

一句话概括,在基类中用virtual修饰成员函数,在子类中重写该函数。虚函数肯定是类的成员函数。
存在虚函数的类都有一个一维的虚表,类的对象有一个指向虚表开始的指针vptr,虚表与类对应,虚指针与对象相对应。
虚函数表并不真实存在,只是虚表的一部分。
虚表的结构:
offset
RTTI
虚函数1
虚函数2
多态性就是一个接口多种实现,抽象类至少包含一个虚函数的类。(抽象类就是申明了纯虚函数的类)。

9.为什么含虚函数的类中析构函数要定义成虚函数?

派生类的析构函数只会析构它自己的那部分,如果基类的虚构函数不是虚函数,则不能调用基类的析构函数析构从基类继承来的那部分成员,所以会出现删一般的现象,从而造成内存泄漏。

10.为什么构造函数不要定义成虚函数?

在基类的构造过程中,虚函数的调用从不会传递到派生类中。析构函数不要抛出异常,否则可能会导致程序不正常退出。

11.友元类和友元函数

在C++中,类的成员数据通常都是私有的,当我们需要一个可以随时访问私有成员不属于该类的函数时,就把这个函数定义为友元函数,友元不能继承,是单向友元。

12.STL容器底层实现

vector:动态数组
双端队列:双向列表
双端链表:双端数组
set:红黑树
map:红黑树
stack:list
priority_queue:vector实现
hash_set:hash表

13.红黑树,B树,B+树

(1)红黑树是二叉查找树,也是平衡树。红黑树是一种含有红黑结点并且能自平衡的二叉查找树。红黑树不是完美平衡二叉树,而是黑色平衡二叉树。
(一).每个结点不是黑色就是红色
(二).根节点是黑色的
(三).每个叶子都是黑的
(四).任意根节点到任一叶子的路径都包含同样多的黑色结点。
三种平衡策略:左旋、右旋、变色。
红黑树插入的总是红色结点。
(2)B树是一种树状数据结构,是为了硬盘或者其他存储设备设计的一种多叉树。一个含有n个结点的B树高度是lgn。可以在O(lgn)内实现插入和删除。
一棵m阶B树的特性如下:
(一)每个节点最多有m个孩子
(二)除根结点和叶子结点外,每个结点至少有ceil(m/2)个孩子
(三)每个非终端结点不包含记录
B+树的叶子包含全部关键字信息,每个非终端结点都是索引,VSAM


  

造一个分布式轮子
1 声望0 粉丝