C++面试总结
本次文章主要记录2017年8月9日的一次面试,面试官问的相对比较简单,但是发挥的不是很好,基础的知识都有遗忘,因此将笔试以及面试知识点总结在此。
1、基本数据类型所占的字节大小
基本关系:short <= int <= long
数据类型 | 32位操作系统 | 64位操作系统 |
char | 1个字节 | 1个字节 |
*(指针) | 4 | 8(改变) |
short int | 2 | 2 |
int | 4 | 4 |
unsigned int | 4 | 4 |
float | 4 | 4 |
doule | 8 | 8 |
long | 4 | 8(改变) |
unsigned long | 4 | 8(改变) |
long long | 8 | 8 |
2、字节对齐问题(怎么做的、有什么作用)
(1)为什么要进行字节对齐:在计算机体系中,CPU对内存的读取时按照CPU的位数来操作的,32位按照4字节进行存取(64位按照8字节)数据,考虑到计算机的指令周期,为了计算机能够在一次指令周期完成对数据的存取,需要对内存中的数据进行字节对齐,以提高计算机的存取效率。如果未进行字节对齐,有的数据会存储在奇数的位置,那么计算机再一次指令周期内无法完成对数据的存取,需要两个指令周期分别获得数据的高低字节来进行数据重组,这样计算机的性能会降低。
(2)字节对齐是怎么做的:每个数据都有自己的对齐字节,数据必须在符合对齐自己的的位置进行存储。在定义不同类型数据时,程序员可以不用特别关注字节对齐的问题,编译器会根据CPU的自己类型来自动进行数据字节对齐存储,如果要制定字节对齐的方式,可以使用预编译指令#pragma pack(val)告诉编译器,以参数val制定的对齐值来取代默认的字节对齐值。
(3)有什么作用:可以提高CPU的存取效率。
举例分析:(一般字节对齐对结构体类型大小影响比较明显)
1 struct A{ 2 int a; //4 3 char b; //1 4 short c; //2 5 };
在此结构体中,a占4个字节,b占1个字节,c占2个字节,总共为7个字节,但是为了自己对齐,编译器会在存储完c后,自动填充一个字节再进行下次数据的存储,因此结构体A的大小为8个字节。
struct B{ char a; //1 int b; //4 short c; //2 };
结构体B中,存储完a会自动填充3个字节然后存储b,存完c后,为了字节对齐,又填充2个字节,因此大小为12字节。可见,结构体的大小与数据存储的顺序有关系。
3、SQL数据库查询
4、避免死锁所需最少资源数计算
5、二叉树查找问题
6、归并排序算法
7、部分字符串移位
8、斐波那契数列打印(此代码运行超时,需要算法后优化)
1 #include <stdio.h> 2 3 int getNthNumber(int n); 4 5 int main() 6 { 7 int n = 0; 8 int num = 0; 9 scanf("%d",&n); 10 num = getNthNumber(n); 11 printf("结果:%d ",num); 12 } 13 int getNthNumber(int n) { 14 // write code here 15 //int i = 0; 16 17 int num1; 18 int num2; 19 int num3; 20 num1 = num2 = 1; 21 if (n > 0 && n <= 2) 22 { 23 return 1; 24 } 25 26 for (int i = 2; i <= n; i++) 27 { 28 num3 = num1 + num2; 29 num1 = num2; 30 num2 = num3; 31 32 //printf("%d ",num3); 33 } 34 35 return num3; 36 }
9、使用迭代器删除vector元素具体怎么操作
10、windows多线程编程
11、字符串拷贝怎么限定目的地址大小
12、友元实现了什么
13、类的三种继承问题
14、多态实现机制
15、虚继承通过指针访问子类和父类成员函数问题