- 博客(87)
- 收藏
- 关注
转载 腾讯后台一面(网上找的面经,找了答案记录下来)
1.C++右值引用和std::moveC++11右值 &&引用2.C++的析构函数为什么要加上virtualC++的析构函数为什么要加上virtual3.Redis 单线程为什么效率高Redis为什么是单线程、及高并发快的3大原因详解4.Linux 的 /proc 和 /dev 目录,了解吗Linux下/proc和/dev目录简介5.HTTP 1.1 和 2.0 的区别HTTP/2 相比 1.0 有哪些重大改进?...
2020-08-21 15:36:35
310
转载 百度+c++一面(网上找的面经,自己找了答案记录下来)
1.进程和线程的区别进程是运行中的程序,线程是进程的内部的一个执行序列进程是资源分配的单元,线程是执行行单元进程间切换代价大,线程间切换代价小进程拥有资源多,线程拥有资源少多个线程共享进程的资源2.get和post区别对比 GET 与 POST3.url页面的响应过程url页面的响应过程4.cout和printf区别1)书写格式不一样2)printf需要你告诉它格式(int %d, double %f,char %c), 而cout不需要3)printf是函数。cout是ostre
2020-08-07 10:20:06
327
转载 字节C++后端一面(网上面经,找了答案记录下来)
1.C++ 程序编译到运行经历了什么预处理->编译->汇编->链接C/C++ 程序编译过程详解2.#define(宏定义)和const(常量)(1) 编译器处理方式不同(2) 类型和安全检查不同(3) 存储方式不同(4) const 可以节省空间,避免不必要的内存分配。(5) 提高了效率。(6) 宏替换只作替换,不做计算,不做表达式求解#define(宏定义)和const(常量)3.C++ 类指针赋为空,调用类函数会出现什么,为什么?C++中使用空对象指针调用成员
2020-07-29 15:25:56
622
转载 字节跳动-抖音C++开发面经(牛客上的面经,找了答案记录下来)
1.最长无重复字符子串滑动窗口解法:最长无重复子串2.std::unordered_map/std::map的区别1)map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的。可以做到在O(log n)时间内完成查找,插入和删除。2)unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的。在需要有序性或者对单次查询有时间要求的应用场景下,使用map,其余情况使用unordered_map。3.s
2020-05-29 21:50:08
1551
转载 腾讯 C++后台开发面经(牛客上的面经,找了答案记录下来)
LINUX1.Linux进程调度算法1)先来先服务2)短作业优先3)最短剩余时间4)时间片轮转5)最高响应比优先6)公平共享调度Linux进程调度算法2.Linux进程地址空间分布3.Linux内存管理方法Linux内存管理linux 内存管理初探...
2020-05-28 15:35:45
828
转载 网易社招面试(牛客上的面经,找了答案记录下来)
1.struct和union的区别1)在任何同一时刻, union存放一个被选中的成员, 而struct存放所有的成员变量。2)对于union的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的3)内存分配不同union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小。struct分配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关。Struct 和 Union 的详细区别2.虚函数的作用及实现原理虚函数的作
2020-05-22 16:22:00
1519
转载 腾讯社招电面(牛客上的面经,找了答案记录下来)
1.free()函数入参是一个void*指针,它是如何知道被指向的大小的?举个例子:假设你用malloc需要申请100字节,实际是申请了104个字节。把前4字节存成该块内存的实际大小,并把前4字节后的地址返回给你。 free释放的时候会根据传入的地址向前偏移4个字节 从这4字节获取具体的内存块大小并释放。2、查找二叉搜索树中第k小的元素?中序遍历将二叉树元素从小到大放到容器中,返回k-1位置上的元素即可。解题思路3、数据库为什么使用B树作为存储数据的数据结构?为什么说B+树比B树更适合数据库索引?
2020-05-21 20:11:07
747
转载 Linux程序编译链接动态库版本的问题
不同版本的动态库可能会不兼容,如果程序在编译时指定动态库是某个低版本,运行是用的一个高版本,可能会导致无法运行。Linux上对动态库的命名采用libxxx.so.a.b.c的格式,其中a代表大版本号,b代表小版本号,c代表更小的版本号,我们以Linux自带的cp程序为例,通过ldd查看其依赖的动态库 $ ldd /bin/cp ...
2019-12-02 15:19:19
3246
2
转载 动态符号链接的细节
基本概念ELFELF 是 Linux 支持的一种程序文件格式,本身包含重定位、执行、共享(动态链接库)三种类型(man elf)。代码:/* test.c */#include <stdio.h> int global = 0;int main(){ char local = 'A'; printf("local = %c, ...
2019-12-02 11:15:28
441
原创 链接器-初探
#一. 首先先回顾一下c文件里面的内容(声明和定义)*定义也是声明/ *这是未初始化的全局变量的定义* / int x_global_uninit; / *这是初始化的全局变量的定义* / int x_global_init = 1; / *这是未初始化的全局变量的定义,尽管 *只能在此C文件中通过名称访问的变量* / static int y_global_uninit; ...
2019-11-29 11:34:14
477
转载 <<Linux内核设计与实现>>读书笔记(十二)-内存管理
内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决).所有内核的内容管理必须简洁而且高效.主要内容:内存的管理单元获取内存的方法获取高端内存内核内存的分配方式总结1.内存的管理单元内存最基本的管理单元是页,同时按照内存地址的大小,大致分为3个区.1.1 页页的大小与体系结构有关,在 x86 结构中一般是 4KB 或者 8KB.
2017-05-14 01:52:35
452
转载 <<Linux内核设计和实现>>读书笔记(十一)-定时器和时间管理
系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要.主要内容:系统时间定时器定时器相关概念定时器执行流程实现程序延迟的方法定时器和延迟的例子1.系统时间系统管理的时间有2种:实际时间和定时器.1.1 实际时间实际时间就是现实中钟表上显示的时间,其中内核并不常用这个时间,主要是用户空间的程序有时需要
2017-05-13 01:24:18
945
转载 <<Linux内核设计与实现>>读书笔记(十)-内核同步方法
内核中提供了多种方法来防止竞争条件,理解这些方法的使用场景有助于我们在编写内核代码时选用合适的同步方法,从而即可保证代码中临界区的安全,同时也让性能损失降到最低.主要内容:原子操作自旋锁 读写自旋锁信号量读写信号量互斥体完成变量大内核锁顺序锁禁止抢占顺序和屏障总结1.原子操作原子操作是由编译器来保证的,保证一个线程数据的操作不会被其他线程打断.原子操作有2类:原子整数操作,
2017-05-11 00:45:12
542
转载 <<Linux内核设计与实现>>读书笔记(九)-内核同步介绍
存在共享资源(共享一个文件,一块内存等等)的时候,为了防止并发访问时共享资源的数据不一致,引入了同步机制.主要内容:同步的概念同步的方法-加锁死锁锁的粒度1.同步的概念了解同步之前,先了解另外2个概念:临界区-也称为临界段,就是访问和操作共享数据的代码段.竞争条件-2个或2个以上线程在临界区里同时执行的时候,就构成了竞争条件.所谓同步,就是防止在临界区形成竞争条件.如果临界区里是原子操
2017-05-10 14:09:18
466
转载 <<Linux内核设计与实现>>读书笔记(八)-中断下半部的处理
在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快地响应硬件.主要内容:中断下半部的处理实现中断下半部的机制总结中断下半部的实现中断实现示例1.中断下半部处理那么对于一个中断,如果划分上下两部分呢?哪些处理放在上半部,哪些处理放在下半部?这里有一些经验可供借鉴:如果一个任务对时间十分敏感,将其放在上半部如果一个任务和硬件有关,将其放在上半部如果一个任务
2017-05-10 00:35:41
609
转载 <<Linux内核设计与实现>>读书笔记(七)-中断处理
中断处理一般不是纯软件来实现的,需要硬件的支持.通过对中断的学习有助于更深入地了解系统的一些底层原理,特别是驱动程序的开发.主要内容:什么是中断中断类型中断相关函数中断处理机制中断控制方法总结1.什么是中断为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制.没有中断的话,CPU和外围设备之间协同工作可能只有轮询这个方法:CPU定期检查硬件状态,需要处理
2017-05-09 17:29:13
332
转载 <<Linux内核设计与实现>>读书笔记(六)-内核数据结构
内核数据结构贯穿于整个内核代码中,这里介绍4个基本的内核数据结构.利用这4个基本的数据结构,可以在编写内核代码时节约大量时间.主要内容:链表队列映射红黑树1.链表链表是linux内核中最简单,同时也是应用最广泛的数据结构. 内核中定义的是双向链表.1.1 头文件简介内核中关于链表定义的代码位于:include/linux/list.h list.h文件中对每个函数都有注释,这里就不详细
2017-05-08 22:43:27
331
转载 <<Linux内核设计与实现>>读书笔际(五)-系统调用
主要内容:什么是系统调用Linux上的系统调用实现原理一个简单的系统调用的实现1.什么是系统调用简单来说,系统调用就是用户程序和硬件设备之间的桥梁.用户程序在需要的时候,通过系统调用来使用硬件设备.系统调用的存在,有以下重要的意义:1)用户程序通过系统调用来使用硬件,而不关心具体的硬件设备,这样大大简化了用户程序的开发. 比如:用户程序通过write()系统调用就可以将数据写入文件,而
2017-05-08 18:12:23
330
转载 <<Linux内核设计与实现>>读书笔记(四)-进程的调度
主要内容:什么是调度调度实现原理Linux上调度实现的方法调度相关的系统调用1.什么是调度现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好地运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程).这个管理程序就是调度程序,它的功能说起来很简单:决定哪些进程运行,哪些进程等待决定每个进程运行多长时间此外,为了获得更好的用户体验,运行中的进程还可以立即被其他
2017-05-08 00:43:07
370
转载 <<Linux内核的设计与实现>>读书笔记(三)-Linux的进程
进程是所有操作系统的核心概念,同样在linux上也不例外.主要内容:进程和线程进程的生命周期进程的创建进程的终止1.进程和线程进程和线程是程序运行时的状态,是动态变化的,进程和线程的管理操作(比如创建,销毁等)都是由内核来实现的.Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的进程.所以下面只讨论进程,只有当线程和进程存在不一样的地方才提以
2017-05-07 19:37:24
425
转载 <<Linux内核设计与实现>>读书笔记(二)-内核开发的准备
在尝试内核开发之前,需要对内核有个整体的了解.主要内容获取内核源码内核源码的结构 编译内核的方法内核开发的特点1.获取内核源码内核是开源的,所以获取源码特别方便,参照以下的网址,可以通过git或者直接下载压缩好的源码包.http://www.kernel.org2.内核源码的结构 目录 说明 arch 特定体系结构的代码 block 块设备I/O层 crypo
2017-05-07 15:36:05
278
转载 <<Linux内核设计与实现>>读书笔记(一)-内核简介
本章简单介绍内核相关的基本概念.主要内容:单内核和微内核内核版本号 1.单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行 1.简单.2.高效:所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销. 微内核 内核按功能被划分成各个独立的过程.每个过程独立地运行在自己的地址空间上 安全:内核的
2017-05-07 13:05:29
257
转载 常见设计模式的应用场景
设计模式主要分为三个类型:创建型,结构型和行为型.其中创建型有:1.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 应用场景:一个无状态的类使用单例模式节省内存资源.2.Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 应用场景:一系列相互依赖的对象有不同的具体实现.提供一种"封装机制"来避免客户
2017-05-06 20:52:40
710
原创 Iterator模式
STL中的集合都有Iterator,Iterator模式的作用是遍历集合中的元素.它的实现原理为遍历封装在一个类中进行(Iterator类),这样避免了暴露这个聚合对象内部.Iterator模式如下图: 实现: //Aggregate.h#ifndef AGGREGATE_H_#define AGGREGATE_H_typedef int Object;class Iterator;cla
2017-05-06 16:24:35
290
原创 Chain of Responsibility模式
Chain of Responsibility(职责链)模式消息传递是面向对象开发中经常用到的机制,例如异常的传递,如果当前函数/类无法处理异常,可以将其抛到上一层.消息传递类似,如果一个类收到消息,如果当前类无法处理,可以将消息按照预先定义好的路径传递下去,直到有类可以处理这个消息,这就是Chain of Responsibility模式.Handle类中持有自己的指针/引用,指向某一个派生类.如
2017-05-06 16:13:01
367
原创 Visitor模式
在开发时有时会遇到需求变动,这样就要经常去修改已有的设计.比较常见的是在实现好的类中添加新方法客户新需求.这时可以使用Visitor模式.Visitor模式则提供了一种解决方案:将更新封装到一个类中,并由待更改类提供一个接收接口,来实现目的.这里对对象(concreteElement)添加了一个统一的接口:Accept函数,来接收一个访问者对象.通过参数Visitor把对对象的操作移到类外,通过调用
2017-05-06 15:54:00
360
原创 Command模式
在开发中,有时需要向对象发送请求,但是不知道请求的接受者是谁,被请求的操作是什么.这时可以使用Command模式.Command模式将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中的Receiver中.这样实现了操作的对象和操作的具体实现之间的解耦.实现//Receiver.h#ifndef _RECIEVER_H_#define _RECI
2017-05-06 15:08:08
261
原创 Memento模式
Memento(备忘录)模式一个类有很多状态,在开发时有时会遇到想把这个类恢复到之前某一个状态(例如撤销),这时候就用到了Memento模式.Memento模式思想比较简单,就是创建一个类Memento对象来记录另一个类的状态,可以用这个Memento对象将它恢复到创建它时的状态.用类图表示如下: 在实现时,类Memento所有方法都为private,类Originator为其友元,这样其他类就无
2017-05-06 14:31:08
278
原创 Observer模式
Observer模式是开发中,使用比较多的模式之一.Observer模式叫做观察者模式,它定义了一种一对多的依赖模式,让多个观察者同时监听某一对象状态,当这个对象状态发生变化时,这些观察者都得到通知.下图即为Observer模式的类图: 实现如下: //Subject.h//Subject.h#ifndef _SUBJECT_H_#define _SUBJECT_H_#include <s
2017-05-06 14:12:20
342
原创 State模式
一个事物,在不同的状态下会有不同的动作,还可以变化到另一个状态,在开发时有时会遇到这样的事物.有限状态机就是这样的一个事物,在实现时用到了switch case来解决,在状态不多时,这样可以解决,如何状态很多,switch case就会变得难以维护.switch case还有一个缺点就是逻辑和实现没有分离,动作的代码直接写在了逻辑里,使得维护和扩展变得困难.State模式就是解决这个问题的.其类图结
2017-05-06 13:45:14
259
原创 Strategy模式
Strategy模式Strategy模式要解决的问题和Template模式相似,都是为了把算法的声明和算法的实现解耦.Template模式是通过继承来实现的,而Strategy模式是通过组合来实现的.Strategy模式将算法封装到一个类(Context)里面,通过组合的方式将算法在组合的对象中实现,之后通过委托将抽象接口委托给组合对象来实现.其类结构图如下 实现://Strategy.h//St
2017-05-05 18:43:19
300
原创 Template模式
Template(模板)模式在开发时,有时会遇到对于一个算法的实现,在不同的对象中有不同的实现的问题,但是这个算的框架是相同的,这时可以使用Template模式或者Strategy模式.Template是采用继承的方式来实现这一点,即将算法框架放在抽象基类中,在基类定义好接口,之后在派生类实现算法.类图结构如图所示: 算法实例://Template.h//Template.h#ifndef _TE
2017-05-05 18:14:43
508
原创 Facade模式
Facade(外观模式)模式在开发时,有时已经实现了一些接口,这些接口分布在不同的类或模块中.客户在使用时,需要使用几个接口的组合,但是并不关心这些接口在哪,怎么实现这些接口的.为了便于客户使用,给客户提供一个一致的界面,可以使用Facade模式.此模式定义了一个高层接口,使得子系统更加容易使用.Facade模式的类结构图如下: 其实现如下://Facade.h//Facade.h#ifndef
2017-05-05 17:53:30
291
原创 Flyweight模式
Flyweight(享元)模式在开发时,如果创建很多对象,就会造成很大的内存开销,特别是大量轻量级(细粒度)的对象,还会造成内存碎片.Flyweight模式就是运用共享技术,有效支持大量细粒度对象的设计模式.其类结构图如下: 在FlyweightFactory中有一个管理,存储对象的对象池,当调用GetFlyweight时会首先遍历对象池,如果已存在,则返回,否则创建新对象添加到对象池中.有些对象
2017-05-05 17:42:21
380
原创 Composite模式
在开发时,如果遇到使用递归构建树状的组合结构,那么可以考虑使用Composite模式.Composite模式将对象组合成树形结构,来表示部分,整体的层次结构. 解决整合与部分可以被一致对待问题。其类结构如图所示: 在Component中声明可所有管理子类对象的方法,因此实现Component接口的子类都有了Add,Remove等功能,这样叶子节点和枝节点对于外界没有区别;但是因为Leaf类本身不
2017-05-05 14:39:47
276
原创 Decorator模式
Decorator模式在开发过程中,有时会遇到需要向已经定义好的类添加新功能的需求,这时候通常的做法就是定义一个新类,继承这个类,在新类中添加新功能.采用继承的方式来实现,在使用时,我们经常使用父类的指针或引用通过多态技术来调用子类的接口,但这样就会遇到一个问题:再向子类添加方法时,也需要向父类添加方法,否则通过父类指针或引用就调用不到这个方法.所以Decorator模式没有采用继承来实现,而是采用
2017-05-05 14:04:31
283
原创 Adapter模式
1.Adapter模式 1.1.类模式 1.2.对象模式Adapter模式在软件开发过程中,经常会使用第三方库.如果使用第三方库,那么我们对客户提供的接口和第三方库接口不一致时,应该怎么解决.这是Adapter模式要解决的问题.即把一个类的接口转化为客户希望的接口.适用场景:1、已经存在的类的接口不符合我们的需求;2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可
2017-05-05 01:01:09
390
原创 Bridge模式
Bridge模式在面向对象的开发过程中,要做到2点:1.高内聚 2.松耦合.但是在实际开发过程中难以把握,例如会遇到这样的问题:1)客户给了一个需求,之后我们用一个类A来实现.2)客户的需求有了变化,要用到2个算法来实现.于是我们通过定义一个抽象基类A,再用两个具体类A1和A2实现这两个算法.3)客户需求又有了变化,要求在2个操作系统上实现.我们再抽象一个层次,不同操作系统抽象为A0和A1,每个操作
2017-05-05 00:19:03
228
原创 Prototype模式
Prototype模式Prototype模式(原型模式)是为了让对象自我复制的功能,即可以通过已有对象来创建新对象.Prototype提供了在一个现有对象创建新对象的接口Clone,它的实现和具体语言相关,在C++中通过拷贝构造函数实现.类的结构图如下所示: 实现如下: //Prototype.h//Prototyep#ifndef _PROTOTYPE_H_#define _PROTOTYP
2017-05-04 23:58:55
294
原创 Builder模式
Builder模式Builder 模式 —— 建造者模式(又译成生成器模式)的主要功能是构建复杂的产品,它是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。举个例子,打个生产电脑的比方,这里简单一点,假设生产电脑只需要 CUP、内存和显卡,现在需要生产宏基和戴尔两个品牌的电脑,不用设计模式的实现Acer.javaimport java.util.ArrayList;imp
2017-05-04 20:10:51
326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人