C++面经总结-仅供参考-程序员宅基地

技术标签: C++  linux  

1 父类构造函数调用多态函数

在父类的构造函数中确实没有发生多态。原因是和vptr的初始化有关系。首先看见virtual,c++会这样做:调用父类构造函数时会给子类的vptr赋值指向父类的虚函数表,即vptr指针是分布进行的:1、当执行父类的构造函数的时候,c++编译器会初始化子类的vptr指针,让vptr指针指向父类的虚函数表。如果你在父类的构造函数里面调用虚函数是不会找到子类虚函数的。2、当父类的构造函数执行完毕之后在执行子类的构造函数,这个时候重新让vptr指针真正的指向子类的虚函数表。

2 父类析构函数调用虚函数

从概念上说,析构函数是用来销毁一个对象的,在销毁一个对象时,先调用该对象所属类的析构函数,然后再调用其基类的析构函数,所以,在调用基类的析构函数时,派生类对象的“善后”工作已经完成了,这个时候再调用在派生类中定义的函数版本已经没有意义了。
第三段,基类指针指向派生类对象。构造时,先调用基类的构造函数,此时构造函数中调用了fun(),可以看到,这个fun是基类的fun(),这里“虚函数的动态绑定机制并没有会生效”,这是因为此时派生类还不存在。析构时,先析构派生类,派生类中的fun()调用的是自己的fun(),然后析构基类,基类析构函数中的fun()调用的是基类的fun(),这里“虚函数的动态绑定机制也没有会生效”,这是因为此时派生类已经不存在了。

3 int转换字符串函数,安全吗

在涉及到无符号整形的时候, 要杜绝使用atoi和itoa
我们编写的itoa函数不能处理最大的负数(应该是“最小的负数吧”。。。不过书上是这么写的),即n等于-(2^(字长-1))的情况,请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。

首先做一个实验,处理-(2^(字长-1))+1,可以得出正确结果:

再处理-(2^(字长-1)),将(2)处代码的数值改为-2147483648,出现编译警告并得不出正确结果:

4 格式化字符串函数占位符

5 内存分配及delete.底层实现

内存分配:堆,栈,全局区
https://blog.csdn.net/cherrydreamsover/article/details/81627855

https://blog.csdn.net/cherrydreamsover/article/details/81022039
1.因此new的作用就是:
调用operator new分配空间。
调用构造函数初始化对象。

2.delete作用
调用析构函数清理对象;
调用operator delete释放空间。

3.new[ ]的作用
调用operator new分配空间。
调用N次构造函数分别初始化每个对象。

4.delete[ ]的作用
调用N次析构函数清理对象。
调用operator delete释放空间。

6 文件描述符

操作系统为每一个进程维护了一个文件描述符表,该表的索引值都从从0开始的,所以在不同的进程中可以看到相同的文件描述符,这种情况下相同的文件描述符可能指向同一个文件,也可能指向不同的文件,具体情况需要具体分析,
文件描述符限制

文件描述符是一个重要的系统资源,理论上系统内存多大就应该可以打开多少个文件描述符,但是实际情况是,内核会有系统级限制,以及用户级限制(不让某一个应用程序进程消耗掉所有的文件资源,可以使用ulimit -n 查看)

对应关系

应用程序进程拿到的文件描述符ID == 进程文件描述符表的索引,通过索引拿到文件指针,指向系统级文件描述符表的文件偏移量,再通过文件偏移量找到inode指针,最终对应到真实的文件

7 互斥锁的抢占机制

抢到锁的线程继续运行,运行完成释放锁;
没抢到锁的线程睡眠,直到锁被释放才唤醒线程重新竞争锁

8 线程的原子性理解

原子操作可以保证指令以原子方式执行,不会被中途打断(中断也不会打断一个指令,处理器只有在当前指令完成后才会去处理中断)。内核提供了两套原子操作的接口,一套用于整数原子操作,一套用于进行位原子操作。这些接口的实现是和架构相关的,Linux系统支持的所有架构都实现了这些接口。大部分架构为简单的算术运算提供了原子版本的指令。有些架构缺乏直接的原子操作指令,但是提供了锁内存总线的命令来锁定内存总线,确保其他可能修改内存的操作无法同时执行。

9 vector底层实现及申请的空间在堆上

iterator allocate_and_fill(size_type n,const T& x)

{

iterator result= data_allocator::allocate(n);

uninitialized_fil_n(result,n,x);

return result;

}

第一级配置器那么data_allocator::allocate()实质上就是直接调用c语言中的malloc()来申请堆空间

2、vector的析构

vector申请的空间是存在堆中的

一般析构函数只能释放vector中的元素,并不能释放里面的空间。
可以用下面这种方法释放:
vector().swap(arr); //交换后
//方法二、
{
vector temp;//临时对象未初始化,其缓冲区大小为0,没有数据
arr.swap(temp);//与我们的对象交换数据,arr的缓冲区就没了。
}//临时变量会被析构,temp调用vector析构函数释放空间

10 缓存机制

10.1 缓存机制:

内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。
缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。
CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。

Swap用途:Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大

10.2 页缓存

对于磁盘中的部分数据在内存中保留一定的副本,使得应用程序能够快速的读取到磁盘中相应的数据,并实现不同进程之间的数据共享。

解决的问题:

 1.磁盘读写速度较慢(ms 级别);
 2.实现不同进程之间或者同一进程的前后不同部分之间对于数据的共享;

页缓存:就是将一个文件在内存中的所有物理页所组成的一种树形结构,我们称之为基数树,用于管理属于同一个文件在内存中的缓存内容。

11 求10万个数据的中位数

中位数问题可以看做一个统计问题,而不是排序问题,无符号整数大小为4B,则能表示的数的范围为为0 ~ 2^32 - 1(40亿),则可以用一个2^32(4GB)大小的数组(也叫做桶)来保存100亿个数中每个无符号数出现的次数。遍历这100亿个数,当元素值等于桶元素索引时,桶元素的值加1。当统计完100亿个数以后,则从索引为0的值开始累加桶的元素值,当累加值等于50亿时,这个值对应的索引为中位数。时间复杂度为O(n)。

12 求大数的和

思路:1.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;
2.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;
3.把两个正整数相加,一位一位的加并加上进位。

13 内存泄漏检测工具

windbg coredump

14 DB优化

1、选取最适用的字段属性,应该尽量把字段设置为NOTNULL
2 使用连接(JOIN)来代替子查询(Sub-Queries),JOIN不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作
3 使用联合(UNION)来代替手动创建的临时表
4 事务 (
BEGIN; INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item=‘book’; COMMIT;
优点:1)要么语句块中每条语句都操作成功,要么都失败。可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
2)当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
缺点:独占性,有时会影响数据库的性能;产生响应延迟)
5 锁定表(可以维护数据的完整性,但是它却不能保证数据的关联性)
LOCK TABLE inventory WRITE SELECT Quantity FROM inventory WHERE Item=‘book’;

UPDATE inventory SET Quantity=11 WHERE Item=‘book’; UNLOCKTABLES
6 使用外键(锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。)
7 使用索引(索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况)
8 优化的查询语句
1)最好是在相同类型的字段间进行比较的操作
2)在建有索引的字段上尽量不要使用函数进行操作
3)在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。
4)避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用

15 库搜索慢原因如何查找,有哪些

16 事务

17 分布式系统一致性如何保证数据完整

18 设计模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/frieryumao/article/details/104325030

智能推荐

<linux/gpio/consumer.h> 头文件_#include <linux/gpio/consumer.h>-程序员宅基地

文章浏览阅读609次。是 Linux 内核中用于进行 GPIO 控制的头文件,提供了一组函数和宏,用于在 Linux 内核编程中对 GPIO 进行详细的操作。主要的操作包括:获取和释放 GPIO 描述符设置和获取 GPIO 的方向设置和获取 GPIO 的输入/输出值等待 GPIO 事件导出和取消导出 GPIO 描述符这些函数和宏可以用于在 Linux 内核中对 GPIO 进行配置、读取和设置操作,适用于各种嵌入式系统和设备驱动开发。详细的使用方法可以参考相关的文档_#include

深度学习如何在医学影像分割上大显神通?——分割网络的三个改进思路-程序员宅基地

文章浏览阅读1.8w次,点赞15次,收藏169次。今天看到了一篇介绍深度学习在医学影像分割中的应用的文章,写的很好,分享给更多需要的朋友。原文链接:https://cloud.tencent.com/developer/article/1029037一、医学影像分割有助于临床工作图像分割在影像学诊断中大有用处。自动分割能帮助医生确认病变肿瘤的大小,定量评价治疗前后的效果。除此之外,脏器和病灶的识别和甄别也是一项影像科医生的日常工作。CT和..._医学影像分割

抖音旅游图文带货,零门槛操作简单_图文带货怎么做csdn-程序员宅基地

文章浏览阅读85次。通过零门槛的操作步骤,选择合适的产品,制作精彩的短视频和图文内容,并与电商平台关联起来,你可以轻松在抖音上进行图文带货。深入挖掘旅游领域(Deep Exploration in Travel Industry):除了产品本身,了解旅游行业的动态和趋势,提供更多有价值的信息和推荐,增加用户的信任度和忠诚度。视频创意营销(Video Creative Marketing):通过独特的视频创意和内容,引起用户的共鸣和关注,提高产品的曝光率和销售量。标题:抖音旅游图文带货:零门槛操作简单的新机会。_图文带货怎么做csdn

docker-base_docker base-程序员宅基地

文章浏览阅读170次。DOCKER BASEAuthor: [email protected]: July 25 20201. Install and Config Docker1.1 Before Installuname -r # Docker require CentOS core above 3.10# with ubuntu:sudo apt# install dependies package:yum-util offer yum-config-manager,another two is de_docker base

C#调用C++类成员函数_c#能用c++吗-程序员宅基地

文章浏览阅读1.7k次。C#是不能直接调用C++的类的,可以使用C++重写一个类库的方法将类中的成员函数暴露出来。一.用常规方法将C++代码封装成可供C++调用的Dll。二.通过C++再写一个类库,将类中的方法暴露出来。将生成的dll连同第一步生成的dll拿出来。添加lib文件路径,并在代码中声明。(这一步一般是从第三方得到的库)将dll文件放在输出目录exe下。1.类库的h文件和cpp文件。封装Dll后得到三个文件,文件放在输出目录下(..._c#能用c++吗

JSON解析的几种方式_json.parseobject的解析方法-程序员宅基地

文章浏览阅读4.4w次,点赞4次,收藏6次。JSON是首先一种数据结构,说白了就是对数据的描述,刚刚出现是为了取代XML,可惜并没有,但是在作为配置文件上,却是很好,由于它小巧灵活,描述数据很好,所以在网络上进行数据传输更加方便。 请记住JSON对数据的描述形式,既然是形式,那么它的数据形式是什么样的: 对象的描述是: {} 这个表示jsonobject(json对象) 数组的描述是: [] 表示jsonarray(json数组)_json.parseobject的解析方法

随便推点

给所有入门程序员的建议_yuyuesetongmian-程序员宅基地

文章浏览阅读719次。 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 解释什么叫编程? 我觉得现在很多同学,根本不知道什么叫编程!我现在告诉你,单纯的编程,也就是就知道语法知识的编程,根本不叫编程,只会单纯的语法的编程连低级程序员都不如! 编程不仅仅是你对语法的掌握,你还要把各种技术混合到里面,这样才叫编程,你编程的时候,你应该问问自己,你的程序有算法吗?你的程序写的够简单吗?速度足够快吗_yuyuesetongmian

强化学习——连续动作空间与DDPG_强化学习 连续动作-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏13次。1.离散动作VS连续动作离散的动作:游戏的操作动作可数,例:向上下左右连续动作:输出的动作不可数 例:推锤子推的力,转方向盘2.DDPGDQN->DDPGActor-Critic结构(评论家-演员)目标网络target network+经验回放replay memory..._强化学习 连续动作

docker-error-at \\\“/dev/mqueue\\\“ caused \\\“no such device_via /proc/self/fd/6): no such device: unknown-程序员宅基地

文章浏览阅读958次。错误信息root@linaro-alip:~# docker run hello-world[ 872.422633] device vethe3c202c entered promiscuous mode[ 872.429088] IPv6: ADDRCONF(NETDEV_UP): vethe3c202c: link is not ready[ 872.599253] IPVS: Creating netns size=1592 id=10[ 872.728377] docker_via /proc/self/fd/6): no such device: unknown

Jmeter 连接数据库报_invalid servertype parameters. the following value-程序员宅基地

文章浏览阅读215次。Jmeter连接数据库,配置完成后,但JDBC Request报错,Cannot create PoolableConnectionFactory (Communications link failure。_invalid servertype parameters. the following values are supported: "jlink",

人工智能的应用领域有哪些?-程序员宅基地

文章浏览阅读2k次。作者:禅与计算机程序设计艺术 1.简介随着科技的飞速发展,人工智能正在改变着世界的很多领域。近几年,随着人工智能技术的不断革新,人工智能在各个领域的应用已经越来越广泛。人工智能的应用主要分为三个阶段:智能产品、智慧城市、智能服务。其中,智能产品包括车联网、智能机器人、无人机等;智慧城市包括智能地图、智

【计算机考研院校推荐】广东地区汇总-22考研版_广东研究生院校有哪些电子计算机类 定向-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏9次。本篇文章由皮皮灰收集数据来源21考研,仅供22考研参考收集招生081200 计算机科学与技术、083500 软件工程、083900 网络空间安全、085400 电子信息-计算机方向的院校更为详细的院校信息可在后台回复获取广东地区院校目录1.(10558)中山大学【985/211】 2.(10559)暨南大学【211】3.(10560)汕头大学4.(10561)华南理工大学【985/211】5.(10564)华南农业大学6.(10566)广东海洋大学..._广东研究生院校有哪些电子计算机类 定向

推荐文章

热门文章

相关标签