补充:static全局变量一般来说存储在静态存储区。如果static全局变量未初始化,存储在bss段;初始化后存在data段。但static全局变量的存储位置和编译器优化相关,也可能存储在堆区。
3.堆区都是手动释放?
答:也不一定,主要看使用方法。如果使用的函数是malloc,new之类,就需要手动释放,不然会造成内存泄漏。但是如果我们使用智能指针,智能指针会自动释放内存,因为智能指针基于类自动调用析构函数实现了内存的自动释放。
4.介绍一下map容器?
答:map支持kv键值对的查找,底层基于红黑树,查询和插入的时间复杂度都是logn。因为底层基于红黑树,map的key是有序的,所以map容器为我们提供了一些有序的api,比如对key的二分查找(lower_bound)。与此同时,我们还有unoredered_map,这个容器是哈希表,查询和插入的时间复杂度是O(1),但是如果遇上哈希冲突,复杂度可能退化到O(n)。这个容器的key是无序的。unordered_map的使用的常数时间是要比map快一到两倍。
5.C++11有哪些新特性?
答:C++11有许多新特性,例如上文我们提到的智能指针,实现了对堆区的动态管理。还有右值语义和完美转发之类的,右值语义基于移动构造函数,使用时可以减少不必要的拷贝。
C++11引入了很多新特性,包括但不限于以下几点:
1.自动类型推导:使用关键字 auto 可以让编译器自动推导变量的类型。
2.Lambda表达式:可以在函数内部定义匿名函数,从而方便地实现函数对象。
3.右值引用和移动语义:使用 && 可以表示右值引用,引入了移动构造函数和移动赋值运算符,可以减少不必要的拷贝。
4.初始化列表:使用 {} 可以方便地初始化数组、结构体、类等对象。
5.静态断言:使用关键字 static_assert 可以在编译时检查一个表达式是否为 true。
4.智能指针:引入了 std::unique_ptr、std::shared_ptr 等智能指针,方便地进行动态内存管理。
5.新的容器和算法:引入了 std::array、std::forward_list、std::unordered_map、std::move 等新特性,增强了容器和算法库的功能。
6.聊一聊你理解的移动构造函数?
答:移动构造函数本质上是基于指针的拷贝,实现对堆区内存所有权的移交,在一些特定场景下,可以减少不必要的拷贝。比如用一个临时对象或者右值对象初始化类实例时。我们可以使用move()函数,将一个左值对象转变为右值对象。
7.那c++有哪些构造函数呢?
答:默认构造函数,有参构造函数,拷贝构造函数,移动构造函数。
8.讲一讲const关键字。
答:const关键字在C++11之前,具有只读和常量两个语义。在C++11,引入constexpr关键字之后,const语义固定在了只读,constexpr固定为常量,但总而言之,这个两个关键字核心的语义是,指向的内容不可更改。
const 关键字用于指定变量或对象的值是不可修改的。它可以用于修饰变量、函数参数、函数返回值和成员函数等。 constexpr 关键字用于指定表达式在编译时就能够被计算出结果,从而产生一个编译期常量。它可以用于修饰变量、函数、类和模板等。constexpr 的作用是在编译时进行计算,从而提高程序的性能。
9.那const指向地址呢?
答:const指向的地址值不可更改,但是地址对应的内容是可更改的。
10.虚函数是什么,重载和重写的关系。
答:虚函数涉及到C++的多态。当、在基类中声明一个虚函数,在派生类中重写该函数,可以实现动态绑定。在运行时,程序会根据具体对象的类型调用相应的函数。重写要求函数签名完全一致,即函数名,函数变量和返回值完全一致,但是函数体可以不同。重写是运行时多态,也就是动态多态。重载是函数名相同,返回值和函数参数可以不同,重载是编译时多态,即静态多态。
11.讲讲你理解的虚基类。
答:C++的虚基类类似Java的抽象类,是不可以实例化的。
虚基类是 C++ 中一种特殊的类,用于解决多继承所带来的"菱形继承"问题。如果一个派生类同时从两个基类派生,而这两个基类又共同继承自同一个虚基类,就会形成一个"菱形"继承结构,导致派生类中存在两份共同继承的虚基类的实例,从而引发一系列的问题。为了解决这个问题,我们可以将虚基类作为共同基类,并在派生类中采用虚继承的方式。虚继承会使得派生类中只存在一份共同继承的虚基类的实例,从而避免了多个实例之间的冲突。虚基类是可以被实例化的。
12.讲一讲四次挥手?
答:TCP的四次挥手分为主动关闭方和被动关闭方。主动关闭方因为自身的stream结束,主动发送了FIN报文,为第一次挥手。被动关闭方发送对第一次挥手确认的ACK报文,这为第二次挥手。接着被动方的stream结束,发送FIN报文,此为第三次挥手。最后,主动关闭方发送ACK报文对第三次挥手进行确认,为第四次挥手。
13.为什么是四次挥手,不能是两次挥手吗?
答:因为发送方发送完FIN报文之后,需要对方回复ACK报文表示:发送方的FIN报文被接收方确认已经收到。所以一定需要四次挥手。如果只有两次挥手,主动关闭方和被动关闭方分别发送FIN报文,不接受ACK报文。主动关闭方和被动关闭方无法知道发送的FIN报文被对方收到,因为FIN报文可能在网络中遗失了。
14.讲讲close_wait状态和last_ack状态的区别?
答:这两个状态都是被动结束方的状态,被动结束方接收第一次挥手,从establish状态变成close_wait状态。接着。被动结束方发送第二次和第三次挥手,从close_wait状态转变到last_ack状态。在last_ack状态,被动结束方等待主动结束方的第四次挥手。其中,第二次和第三次挥手之间,需要程序员触发close()。
15.如果在time_wait状态点击read会怎样?
答:在 TIME_WAIT 状态下,如果尝试进行读取操作,会返回一个错误码,表示连接已经关闭。因为在这个状态下,连接已经被完全关闭,不能再进行数据传输。因此,如果在 TIME_WAIT 状态下尝试进行读取操作,很可能会导致读取失败,并返回一个错误码。
这个我不太懂,请大家解答
16.HTTP请求有哪些方法,GET和 POST方法有什么区别?
答:HTTP请求有head,get,post方法。其中GET方法语义倾向于下载,post倾向于上传。
17.会mysql和redis吗
答:只是会简单的使用,深度比较浅。
18.算法题:合并两个升序链表。十分钟秒了。
本系列我会一直连载。如果面试题有错误,欢迎大家斧正,祝大家秋招顺利!
#提前批##大厂##百度##面试#