C++面试题目

C++ 什么时候生成默认拷贝构造函数

背景:如果不提供,就是浅拷贝(位拷贝);
浅拷贝的危害:
1、堆上的资源
2、文件句柄,socket
导致两个对象持有相同的文献资源,当一个对象释放了资源,另外一个对象时浅拷贝过来的,那么此时该对象操作资源时会报错;

什么时候触发拷贝构造函数?
在这里插入图片描述
函数返回值会产生编译器优化,
在这里插入图片描述

什么时候生成默认拷贝构造函数?
编译器编译的时候生成,为什么生成,因为不得不生成;
1、类的成员变量也是一个类,该成员类有默认拷贝构造函数;
2、类继承字一个基类,基类有默认的拷贝构造函数;
3、类成员中存在一个或多个虚函数,防止虚函数表指针的浅拷贝,要深拷贝;
4、类继承自基类,基类中存在虚函数,和3一样;

进程和线程的区别

进程和线程在内核当中都是task_struct结构体来描述的;
一个进程中可能有多个线程;
区别:
1、进程:资源分配的基本单位;线程:CPU资源调度的基本单位;
2、并发性:从切换效率来考虑; 切换最主要涉及的是一个上下文的切换(重点:现场环境的保护和恢复,例如保存CPU指令、程序计数器,用户空间的信息、内核空间pcb等)
进程之间切换:
独立分配虚拟内存空间;所有信息都需要进行切换;
线程的切换:
不同进程中的线程切换和进程之间切换是一样的;
同一个进程中的线程切换:切换的信息要少一些;用户空间的信息和内核空间的信息就没必要切换了,因为他们共享一个内存的数据;
3、线程没有独立的内存空间,但会分配栈空间,程序计数器和本地存储等独立空间;默认8M;进程有独立的虚拟内存空间;说明多个进程之间的运行环境是隔离的;多线程的弊端:加锁的负担(涉及临界资源)
4、所属关系:一个线程属于一个进程;一个进程可以拥有多个线程;
5、进程间运行环境相互隔离,一个进程崩溃不会导致其他进程;一个线程崩溃会导致整个进程崩溃;

CPU调度是只认线程的,所以才有切换线程这个操作;
如果一个进程中只有一个线程,那么就会涉及到进程调度;从一个线程切换到另一个进程的线程也是要涉及到进程调度;

C++面试掌握技能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

只用2GB内存在20亿个整数中找到出现次数最多的数

分析1:使用hash做词频统计,key-value:key为整数,value为该整数出现的次数;key为4B,value也为4B
(4B表示最大整数位2^31 - 1 > 20亿);
分析2:
全部整数都相同,一个hash记录搞定,也就是8B
一个hash记录占用8B,2亿条hash记录占用1.5GB //当存在2亿个不同的数时;
当存在20亿条hash记录时,需要15GB内存,此时内存不够用;
解决办法: 将这个大集合通过哈希函数映射到多个小文件中;
分析3:要映射到多少小文件中:整数的取值个数为232个,题目所给2G内存为231B,每条记录为8B,也就是可以存储2^28B条记录;
int整数的个数为232个,那么就需要232 / 2^28 = 16个小文件来存储;即:使用16个小文件来存储
分析4:通过统计着16个小文件中的出现次数最多的数和字数统计,取最大值即可;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

32位无符号整数的范围是0~4294967295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有没出现过的数。可以使用最多1GB的内存,怎么找到所有没出现过的数?

参考文献:https://www.cnblogs.com/clarencezzh/p/11703395.html
分析1:使用hash表来保存记录 40亿条记录,每条记录占8B,40亿*8B=160亿字节,大约16GB;
分析2:申请一个2^32 - 1的bit类型数组bitArr,数组的每个元素只表示0和1,代表某个数是否出现,
分析3:2^32 - 1个位,就是大约229B,也就是229B / 2^10 / 2^10 = 2^9MB = 512MB;
分析四:使用这个数组去遍历40亿个数,当某个数为400,将bitArr[400]置为1;遍历完成后,再次遍历:那个位置没有被置为1,那个数就没出现;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值