
面经
文章平均质量分 88
个人回收
这个作者很懒,什么都没留下…
展开
-
C++面试
post请求不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存。2、post请求发送的数据更大,get请求有url长度限制。通常情况下,缓存中的数据都是有过期时间的,当某个热点数据过期后,如果大量请求同时访问该数据,此时缓存为空,请求就会直接访问数据库。(1)post请求更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存)原创 2023-07-20 15:10:45 · 230 阅读 · 0 评论 -
C++面试
在以下情况下,使用 inline 修饰符可能会失效:过度使用 inline 会让程序的可读性和可维护性降低,因为 inline 函数的定义通常是放在头文件中的,当头文件包含了大量的 inline 函数时会增加编译时间和源代码文件的大小,同时也会增加代码库的依赖关系。在某些情况下,编译器可能会选择不将函数内联,例如函数体过于庞大,或者函数包含循环或递归等结构。这时候使用 inline 修饰符甚至可能会降低程序性能,因为函数调用和返回可能会比函数内部执行代码的开销更大。原创 2023-06-09 19:28:54 · 1082 阅读 · 0 评论 -
C++面试
完美转发是在 C++11 中引入的一种技术,用于将函数传递的参数(包括左值和右值)转发到另一个函数中,同时保持参数的原始类型和值类别。在使用完美转发时,通常需要使用 std::forward 函数模板来实现参数转发。对于右值参数,std::forward 返回右值引用。对于左值参数,std::forward 返回左值引用。如果不使用 std::forward 来实现参数转发,而是直接使用对应的引用类型来传递参数,则会出现参数类型和值类别被截断的情况,导致代码出现编译错误或者运行时错误。原创 2023-06-09 15:12:40 · 875 阅读 · 0 评论 -
C++面试
unique_ptr是C++11标准引入的智能指针,其主要特点是拥有独有的所有权,即只有一个指针可以指向该对象。当unique_ptr指针被销毁时,它自动释放所指向的对象,无需手动释放。unique_ptr的主要优点有:消除了内存泄漏的风险:unique_ptr使用RAII技术,会在超出作用域时自动释放资源。避免了重复释放问题:unique_ptr的一个重要特点是独占所有权,因此它可以避免多个指针同时释放同一个对象的情况。更好的性能:unique_ptr比较轻量级,因此在运行时开销相对较小。原创 2023-06-06 19:55:37 · 568 阅读 · 0 评论 -
C++面试
而线程则可以通过共享变量等方式直接进行通讯。开销:创建一个进程的开销比创建一个线程的开销大,因为进程需要独立的虚拟地址空间、内存空间和系统资源。控制进程执行顺序:比如在一个多进程并行的程序中,有些进程需要等待其他进程执行完毕才能开始执行,这时可以使用信号量来控制进程执行的顺序。执行方式:进程之间相互独立,互不干扰,每个进程都有自己独立的处理器调度,而线程则是在同一个进程内执行,使用同一个进程的处理器调度。资源分配:每个进程都有独立的内存空间和系统资源,如文件描述符、环境变量等,而线程则共享所属进程的资源。原创 2023-06-06 18:38:06 · 504 阅读 · 0 评论 -
C++面试
二叉树是一种树形数据结构,它由一组节点和连接它们的边组成,每个节点最多有两个子节点。UDP 不能保证可靠的数据传输,但在实时应用中,如视频、音频数据的传输,UDP 可以提供更好的实时性和效率。总之,二叉树和图是计算机科学中最常见的数据结构之一,二叉树通常用于搜索和排序算法,而图主要用于模拟现实世界的复杂关系。数据域存放节点的信息,比如链表中存储的整数、字符串等,而指针域则会指向下一个节点的地址。通过 SSL/TLS 协议的加密方式,HTTPS 可以提供更高的安全性,保护用户的隐私信息和数据不被窃取和篡改。原创 2023-06-06 17:42:55 · 546 阅读 · 0 评论 -
C++面试
C++11 STL 使用了一些原子操作来实现 shared_ptr 内部的线程安全,比如 std::atomic_fetch_add 和 std::atomic_fetch_sub 等函数,这些函数保证了在多个线程同时进行引用计数的修改时,可以保证最终结果的正确和准确。它们之间的关键区别在于内部的资源管理方式和所有权机制。安全访问被管理对象:当需要访问被 shared_ptr 管理的对象时,可以通过 weak_ptr 转换为 shared_ptr,并检测其是否已经被销毁,避免了访问已被释放的空指针的危险。原创 2023-06-06 17:43:12 · 486 阅读 · 0 评论 -
C++面试
然后,将b赋值给变量c,由于b是一个左值,因此c实际上也是b的左值引用,但是由于b的类型是int&&,因此c也是int&&类型的左值引用。需要注意的是,虚拟内存的实现也存在一定的开销,例如处理页面失效、磁盘读写等过程所需的时间和性能开销。在指针常量中,const 修饰的是指针本身,而在常量指针中,const 修饰的是指针所指向的内存区域。增加了内存保护的功能,即在每个进程的地址空间中,操作系统将不同的对象(代码、数据、堆栈等)置于不同的页面中,从而增加了安全性和保护性,防止恶意程序进行越界访问等行为。原创 2023-06-05 14:02:06 · 468 阅读 · 0 评论 -
C++面经
在输入一个URL并按下回车键后,会经过以下过程:域名解析:浏览器会检查URL中的域名,并向DNS服务器发出请求,以获取该域名所对应的IP地址。建立连接:浏览器使用获取到的IP地址与Web服务器建立TCP连接。发送请求:浏览器向Web服务器发送HTTP请求,请求中包含请求方法(GET、POST等)、请求头(浏览器的信息、Cookie等)和请求体(表单数据等)。服务器响应:服务器收到请求后,会发送相应的数据给浏览器。这些数据通常是HTML、CSS、JavaScript等文件,以及图片、视频等其他资源。原创 2023-06-02 22:29:45 · 314 阅读 · 0 评论 -
每日面经(二十二)
在高并发场景下,为了保证应用的稳定性和性能,需要注意以下几点:数据库优化: 在高并发场景下,数据库经常会成为系统性能的瓶颈。因此,可以采用数据库读写分离、查询语句优化、索引优化等手段来提升数据库的性能。缓存优化: 缓存是提升系统性能的重要手段,可以采用多级缓存、缓存预热、缓存穿透、缓存雪崩等策略来提升缓存的效率。代码优化: 在高并发场景下,代码的性能也是至关重要的。可以通过尽可能减少HTTP请求、选择高效的算法、使用异步编程等方式来提升代码性能。原创 2023-06-02 15:43:13 · 814 阅读 · 0 评论 -
每日面经(二十一)
在 C++ 中,当我们声明一个函数时,编译器会将该函数名进行名称重整,以便让其能够和其它同名函数进行区分。但是,在某些情况下,我们需要禁用这种默认的名称重整,而是使用C语言中以一种特定的方式命名函数,这时就需要使用 extern "C"。具体来说,extern "C" 用于告诉编译器将函数名以C语言的方式进行处理,也就是不进行名称重整。这对于编写链接到动态链接库(DLL)或静态链接库(LIB)的程序非常有用,因为库文件中的函数名通常不进行名称重整。原创 2023-05-27 00:00:21 · 474 阅读 · 0 评论 -
每日面试(二十)
如果基类的指针指向了一个派生类的对象,并且调用了派生类中未定义的虚函数,那么在虚函数表中就找不到相应的函数地址,会导致程序访问了不存在的内存地址,从而引起内存访问越界的问题。使用动态绑定可以避免这个问题。如果主动关闭方不进入TIME-WAIT状态,而是直接关闭连接,那么在这个时间段内,网络中可能还有一些旧的报文没有被处理完毕,这些报文可能会被错误地发送到新的连接中,导致出现问题。:多态中,如果基类的指针指向了一个派生类的对象,并且调用了派生类中未定义的虚函数,就会导致内存访问越界或者访问非法内存的风险。原创 2023-05-20 23:55:01 · 156 阅读 · 0 评论 -
每日面经(十八)
虚拟内存是一种计算机内存管理技术,它允许程序访问比实际物理内存更大的内存空间。通俗地说,虚拟内存是一种将系统硬盘空间视为内存的技术。虚拟内存通过在程序运行时将一部分程序数据从内存中转移到硬盘上的交换文件(也称为页面文件)中,从而释放出内存空间,使得多个程序可以同时运行在同一个物理内存上,提高了系统资源利用率。虚拟内存还能够将不同程序的内存地址空间同意映射到不同的物理内存地址空间上,从而实现内存隔离和保护。虚拟内存还能够实现内存共享和动态地址映射等一些高级功能。原创 2023-05-17 20:01:09 · 220 阅读 · 0 评论 -
每日面经(十七)
引用和指针都可以用来间接访问变量,但是它们有以下区别:指针可以被赋值为真正意义上的空值,即指向地址0。而引用必须总是绑定到某个对象上。指针可以在声明时不初始化,而引用必须在声明时初始化。指针可以指向不同类型的对象,而引用只能指向其所绑定对象的类型。指针可以被重新指向另一个对象,而引用始终绑定到同一个对象上。指针可以进行指针运算,而引用不能。指向指针的指针可以通过多级间接访问对象,而引用只能通过单级间接访问对象。引用一定不能为NULL,指针可以为空。原创 2023-05-05 19:41:03 · 227 阅读 · 0 评论 -
每日面经(十六)
在TCP连接中,CLOSE_WAIT状态指的是一个TCP连接中的一方(通常是客户端)已经发送了FIN数据包,即表示希望关闭连接,但是另一方(通常是服务器端)还没有发送FIN数据包,即表示还没有确认关闭连接。CLOSE_WAIT状态的作用是等待服务器或者对方连接端的响应,一旦等到了响应,就会进入到最终的关闭状态,完成连接的关闭。CLOSE_WAIT状态通常在以下情况下出现:客户端发送了FIN数据包,请求关闭连接,但是服务器还没有响应;原创 2023-04-29 10:43:12 · 357 阅读 · 0 评论 -
每日面经(十五)
当TCP连接建立成功后,服务和客户端之间开始进行数据通信。如果此时客户端突然挂掉了,会导致TCP连接的异常中断。此时,TCP协议会采取以下机制来处理异常情况:服务端的TCP状态变为“ESTABLISHED”状态,因为此时已经成功建立连接,但是服务端无法检测到客户端的异常。客户端的TCP状态变为“CLOSED”状态,因为客户端已经挂掉了,没有办法继续维持连接。服务端会向客户端发送一个“Keep-Alive”探测包,用于检测客户端是否还存活。原创 2023-04-29 10:27:14 · 221 阅读 · 0 评论 -
每日面经(十四)
TCP 的ACK指的是确认号(Acknowledgement Number),它是 TCP 协议中用于实现可靠传输的重要机制之一。当发送方发送数据之后,接收方会向发送方返回一个带有ACK:当发送方收到带有ACK标志的应答包时,可以确认之前发送的数据已经成功到达了接收方,这样可以提高数据传输的可靠性。:确认号可以帮助接收方控制数据的流量以及避免数据丢失或者重复。原创 2023-04-29 09:56:55 · 173 阅读 · 0 评论 -
每日面经(十三)
操作系统在运行程序时会为其分配内存,其中最常见的是堆区和栈区。它们的区别如下:栈区:由操作系统自动分配和释放,存放函数的参数值、局部变量的值等。栈内存是连续的且大小固定的,一旦分配完成就不能动态地改变大小。栈内存的占用和释放是有系统自动完成的,不需要程序员手动管理。堆区:需要程序员手动分配和释放,存放动态分配的内存,大小可以动态地改变。堆内存通过程序调用malloc()等分配内存的函数来申请空间,通过free()等函数释放空间。原创 2023-04-27 19:42:08 · 94 阅读 · 0 评论 -
每日面经(十二)
请问,以上代码的输出结果是什么?如果将 MyClass 的成员变量 a 改为静态(即为 static int a;),请问输出结果会有什么变化?30303030因为 obj1 和 obj2 都会共享同一个静态变量 b,所以 MyClass::setB(30) 设置的是类的静态成员变量,而不是 obj1 和 obj2 的成员变量。因此,obj1.getB() 等于 MyClass::getB(),它们都返回类的静态成员变量 b,而不是 obj1 和 obj2 的成员变量 a。结果输出为 30,30。原创 2023-04-27 17:10:53 · 165 阅读 · 0 评论 -
每日面经(十)
MySQL要定义数据类型主要是为了规范化数据的存储和操作。定义数据类型可以有效地节省存储空间,提高数据的查询和操作效率,并保证数据的完整性和正确性。具体来说,定义数据类型有以下几个优点:空间效率:不同的数据类型占用不同的存储空间,在定义表的时候选择合适的数据类型可以有效地节省存储空间。例如,一个整数类型的字段要远比一个字符类型的字段占用更少的存储空间。查询效率:对于同一种数据类型的值,相同的比较和操作都可以使用相同的指令,这样可以提高数据的查询和操作效率。原创 2023-04-25 09:50:25 · 269 阅读 · 0 评论 -
每日面经(九)
这道问题可以采用分布式计算的思路来解决。具体来说,可以将这个100亿数据集分成多个子数据集,每个子数据集可以使用单机或者集群来处理。处理完每个子数据集后,可以在集群中合并所有结果,然后在合并后的结果中选取前100个最大值。值得注意的是,这个方案考虑到了数据规模较大,因此需要使用分布式计算或者集群计算的方式来处理数据。为了进一步提高性能和减少I/O操作,可以考虑使用内存映射文件或者DAG(有向无环图)等方式。同时,在实际实现时,也要注意数据的质量和异常值的处理,确保计算结果正确和可靠。原创 2023-04-24 19:16:23 · 116 阅读 · 0 评论 -
每日面经(八)
我们可以看到上边的进程-资源分配图其实是可以进行简化的,也就是说可以在图中找到一个既不阻塞又不与其他进程因请求资源而关联的进程,可以认为该进程会获得所需全部资源而执行,并且在执行结束后释放其拥有的资源,这相当于消去与之相关的请求边和分配边,成为孤立点。左边的图表示已经分配的资源,右边的图表示还需要分配的资源。每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。原创 2023-04-24 13:49:58 · 115 阅读 · 0 评论 -
每日面经(五)
由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。派生类可以继承基类中除了构造/析构、赋值运算符重载函数之外的成员,但是这些成员的访问属性在派生过程中也是可以调整的,三种派生方式的访问权限如下表所示:注意外部访问并不是真正的外部访问,而是在通过派生类的对象对基类成员的访问。公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,都保持原有的状态,而基类的私有成员任然是私有的,不能被这个派生类的子类所访问。原创 2023-04-23 14:00:09 · 62 阅读 · 0 评论 -
每日面经(三)
预处理阶段主要是对源代码进行预处理,将所有的源文件生成一个预编译文件,该文件包括了所有的 #include、宏定义、条件编译等预处理指令所展开的内容,但不包括注释和空格。使用虚函数可以实现多态性,它可以让程序员在不知道对象的实际类型的情况下,利用基类指针或引用来调用一个派生类的函数。在汇编阶段,将汇编代码转成机器语言代码,汇编器会将汇编语言代码翻译成机器语言代码,并且确定符号的地址和位置,生成目标文件。覆盖发生在使用虚函数时,当我们从基类调用虚函数时,实际调用的可能是派生类中的虚函数。原创 2023-04-22 19:45:44 · 64 阅读 · 0 评论 -
每日面经(二)
weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用计数的增加或减少。weak_ptr的使用更为复杂一点,它可以指向shared_ptr指针指向的对象内存,却并不拥有该内存,而使用weak_ptr成员lock,则可返回其指向内存的一个share_ptr对象,且在所指对象内存已经无效时,返回指针空值nullptr。智能指针的智能就在于它能够在适当的时机安全的帮助你释放内存。原创 2023-04-20 15:18:34 · 77 阅读 · 0 评论 -
每日面经(c++)
unique_ptr是一种独占式的智能指针,只能在单个指针中拥有对对象的所有权,而shared_ptr是一种共享式的智能指针,可以在多个指针中共享对对象的所有权。具体来说,如果虚函数被任何函数调用,这个函数带有动态绑定的行为,此时虚函数是不能被内联的,因为编译器无法确定需要调用哪个版本的函数。2. 可以通过基类的指针或引用来访问派生类的对象:通过将派生类指针或引用转换成基类指针或引用来进行对象访问,可以实现基于抽象接口的基于类型的操作,这对于实现一些具有层次结构的数据结构,例如树、图等非常有用。原创 2023-04-17 21:16:15 · 191 阅读 · 0 评论