自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 【C++】【Bug】记录一个复制文件的时候,debug很长时间的一个bug

bug 的现象是:复制得到的文件总是比源文件多几行,而且多的这几行总是最后几行。换句话说,最后几行被多复制了几遍。本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。我想要实现文件的复制的时候,出现的bug。类比过后才发现的问题。

2023-05-02 22:09:09 85

原创 【C++】【socket】01 linux环境下通过 C/S 来传输字符串

server 端需要5个步骤:3. bind4. listen5. acceptclient 端需要 2 个步骤:2. connet。

2023-04-28 16:10:09 275

原创 【C++】【multithreading】chapter3 Sharing data between threads

两个线程同时读的时候,不会任何问题,问题都出现在写上。eg:如果一个线程在写,另一个线程在读。因为写是需要步骤的,假设,写需要四步,1),2),3),4),如果写线程刚好处于第二步的时候,这时,读线程过来读数据了,这时就有可能会产生读出来的数据不对的情况。即便是中间出现了异常,stack unwinding 也会保证destructor一定会运行,从而保证 unlock 一定会运行。当函数退出的时候,会自动调用 lock_guard 的destructor,在destructor中会调用unlock。

2023-04-19 13:27:33 84

原创 【C++】【multithreading】chapter2 managing threads

在线程对象创建之后,调用 join 之前,如果程序出现了 exception ,那么程序就会被终止,join 就无法正常运行,所以要保证,join 在任何情况下都会被顺序执行到,即使出现了 exception 也要保证 join 可以正常运行。介绍了 hardware_concurrency(), 这个函数会返回 CPU 物理意义上支持的最大的线程数。介绍了下线程 id, 如果你想指定某个线程去运行某个程序,就可以用线程 id 来指定。直接在创建线程的时候,在后面加上变量即可。

2023-04-15 16:28:08 60

原创 【C++】【multithreading】chapter1 hello, world of concurrency in C++

如果不添加 t.join() 程序会挂,程序会报错。我只知道 join 后,主线程会等待子线程结束后,再结束。尚不是很清楚会挂的具体原因。本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

2023-04-15 11:09:31 31

原创 【面试题】【C++多线程】已经有了进程,为什么还要有线程?(线程有什么优点?)

Q:已经有了进程,为什么还要有线程?A:1. 线程比较省资源。和进程相比,它是一种非常"节俭"的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。(资源)2. 线程之间的切换效率远远比进程高。运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间。据统计,一个进程的开销大约是一个线程开销的30倍左右。(切换效率)

2023-04-13 15:59:53 93

原创 【面试题】【C++】#include的尖括号和双引号的区别?

Q:#include的尖括号和双引号的区别?A:1)#include ,认为该头文件是标准头文件。编译器将会在预定义的位置集查找该头文件,这些预定义的位置可以通过设置查找路径环境变量或者通过命令行选项来修改。使用的查找方式因编译器的不同而差别迥异。2)#include"",认为它是非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。查找范围大于。

2023-04-13 15:47:39 86

原创 【面试题】【C++】一个C++源文件从文本到可执行文件经历了哪些过程?

Q:一个C++源文件从文本到可执行文件经历了哪些过程?A:对于C/C++编写的程序,从源代码到可执行文件,一般经过下面四个步骤:1).预处理,产生.ii文件2).编译,产生汇编文件(.s文件)3).汇编,产生目标文件(.o或.obj文件)4).链接,产生可执行文件(.out或.exe文件)

2023-04-13 15:37:18 68 1

原创 【面试题】【C++】请你说说 Lambda表达式用法及实现原理?

lambda 本质上就是一个简单的,不需要函数名的函数。

2023-04-13 09:56:31 303

原创 【面试题】【C++】请你说说 map 的实现原理,各操作的时间复杂度是多少?

map 的实现原理底层是红黑树。因为底层是红黑树,所以是有序的,这意味着在std::map中,键是按照从小到大的顺序排列的。当你插入一个新的键值对时,它会自动插入到合适的位置,以维护有序状态。因为底层是红黑树,所以插入、删除和查找的时间复杂度都是 O(log n)本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

2023-04-13 09:48:58 244

原创 【面试题】【C++】请你说说 unordered_map 的实现原理

该属性同样适用于无序容器,用于衡量容器存储键值对的空/满程序,即负载因子越大,意味着容器越满,即各链表中挂载着越多的键值对,这无疑会降低容器查找目标键值对的效率;但由于 unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。可以看到,当使用无序容器存储键值对时,会先申请一整块连续的存储空间,但此空间并不用来直接存储键值对,而是存储各个链表的头指针,各键值对真正的存储位置是各个链表的节点。

2023-04-13 09:42:47 72

原创 【面试题】【C++】请你说说 set 的实现原理?

set 容器中每一个元素就是二叉树的每一个节点,对于 set 容器的插入删除操作,效率都比较高,原因是二叉树的删除插入元素并不需要进行内存拷贝和内存移动,只是改变了指针的指向。对 set 进行插入删除操作 都不会引起迭代器的失效,因为迭代器相当于一个指针指向每一个二叉树的节点,对 set的插入删除并不会改变原有内存中的节点。set 中的元素都是唯一的,而且默认情况下会对元素进行升序排列。不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素。

2023-04-13 09:35:21 309

原创 【面试题】【C++】请你说说 unique_ptr 的实现原理及使用场景?

首先确定的一点是:智能指针就是一个指针,就按照指针来用就行。(虽然本质上来说,智能指针是个类,只是可以像指针一样使用。

2023-04-13 09:34:59 107

原创 【面试题】【C++】请你说说 vector 的扩容机制,扩容以后,它的内存地址会变化吗?

如果vector在增加一个元素的时候,超过了自身最大的容量。vector则将自身的容量扩充至原来的两倍。扩充空间需要经过的步骤:重新配置空间,元素移动,释放旧内存空间。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了。

2023-04-12 21:35:48 271

原创 【面试题】【C++】请你说说 deque 的实现原理

换句话说,当 deque 容器需要在头部或尾部增加存储空间时,它会申请一段新的连续空间,同时在 map 数组的开头或结尾添加指向该空间的指针,由此该空间就串接到了 deque 容器的头部或尾部。也就是说,map 数组中存储的都是指针,指向那些真正用来存储数据的各个连续空间,如图所示。和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域。如涉及作品版权问题,请与我联系删除。

2023-04-12 21:32:21 103

原创 【面试题】【C++】简述 vector 的实现原理

它以两个迭代器start和finish分别指向配置得来的连续空间中目前已经被使用的空间。为了降低空间配置时候的速度,vector实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充。如果vector在增加一个元素的时候,超过了自身最大的容量。扩充空间需要经过的步骤:重新配置空间,元素移动,释放旧内存空间。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了。vector 是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新的元素。

2023-04-12 21:25:51 133

原创 【面试题】【C++】请你简述一下 shared_ptr ?

本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

2023-04-12 21:20:19 112

原创 【面试题】【C++】请问,使用智能指针有没有内存泄漏的情况?

有,当两个 shared_ptr 循环引用的时候,就会出现内存泄漏,此时需要引入 weak_ptr 来破局。本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

2023-04-12 19:32:05 153

原创 【面试题】【C++】请你说说内联函数和函数的区别,内联函数的作用

普通函数在调用时,是先将函数压入栈中。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。当函数体比较小的时候,内联函数可以令目标代码更加高效,可以加快代码的效率。

2023-04-12 16:44:38 90

原创 【面试题】【C++】请你说说C++引用的概念

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

2023-04-12 16:30:35 36

原创 【面试题】【C++】虚析构函数(virtual destructor)有什么作用?

父类的构造函数/析构函数与子类的构造函数/析构函数会形成多态,但是当父类的构造函数/析构函数即使被声明virtual,子类的构造/析构方法仍无法覆盖父类的构造方法和析构方法。当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。没有调用子类的析构函数。

2023-04-12 16:27:36 165

原创 【面试题】【C++】请你说说什么是拷贝构造函数(就是copy constructor),什么情况下会调用赋值构造函数?

复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用。复制构造函数的参数可以是 const 引用,也可以是非 const 引用。一般使用前者,这样既能以常量对象(初始化后值不能改变的对象)作为参数,也能以非常量对象作为参数去初始化其他对象。一个类中写两个复制构造函数,一个的参数是 const 引用,另一个的参数是非 const 引用,也是可以的如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数。

2023-04-12 16:17:27 180

原创 【面试题】【C++】请你说说虚函数可以是内联函数吗?

inline virtual唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::who()),这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。解析:内联发生在函数的编译期间,编译器会自主选择内联,而虚函数的多态性发生在运行期间,编译器无法知道运行期间调用哪个代码,所以,当虚函数变现为多态性时不可以内联。虚函数可以是内敛函数,inline 可以修饰虚函数,但是当虚函数表现多态性的时候不能内联。

2023-04-12 15:58:20 167

原创 【面试题】【C++】请你说说迭代器失效原因,有哪些情况

对容器的操作影响了元素的存放位置,称为迭代器失效。

2023-04-12 15:34:15 78

原创 【面试题】【C++】vector 和 list 有什么区别?分别适用于什么场景?

缺点:由于开辟一段连续的空间,所以插入删除会需要对数据进行移动比较麻烦,时间复杂度O(n),另外当空间不足时还需要进行扩容。vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。缺点:底层没有连续的空间,只能通过指针来访问,所以查找数据需要遍历其时间复杂度O(n),没有提供[]操作符的重载。list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。如涉及作品版权问题,请与我联系删除。

2023-04-10 22:03:04 70

原创 【面试题】【C++】请你说说指针和引用的区别?

4、const修饰指针变量,const放在之前,指针变量所指向变量的值不可改变,指针值可以改变;const放在之后,指针变量所指向变量的值可以改变,指针值不可以改变;const修饰引用,const放在&之前,不能修改引用所表示的变量的值;const放在&之后,const的作用被忽略,可以修改引用所表示的变量的值。c++指针和引用的区别在于:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;8、指针的自增、自减表示指向下一个同类型变量的地址,一般用于指向数组的指针;

2023-04-10 21:47:54 55

原创 【面试题】【C++】简述一下浅拷贝和深拷贝

浅拷贝只复制某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。深拷贝在拷贝的过程中会另外创造一个一摸一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

2023-04-10 11:48:52 131

原创 【面试题】【C++】请你简述下 C++的多态?

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

2023-04-09 14:29:29 37

原创 【面试题】【C++】请你说说 C++ 和 C 中struct 的区别以及 C++ 中 struct 和 class 的区别?

C++中的struct等同于class,只是class默认成员权限是private,而struct默认成员权限是public。C++中的 struct 和 class 就只有一个区别:struct中的成员默认是public的,class中的默认是private的。3. C++ struct里面成员初始化的形式和类是相同的,不可以直接初始化,就是不可以定义成员的时候同时初始化。3. C中的struct只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数。

2023-04-09 13:41:09 32

原创 【面试题】【C++】虚析构函数有什么作用?

3.1 如果父类的析构函数不加virtual关键字当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数3.2 如果父类的析构函数加virtual关键字当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。

2023-04-09 13:36:49 65

原创 【面试题】【C++】什么是野指针?野指针是如何产生的?如何避免野指针?

野指针是指指向的位置是随机的、不可知的、不正确的。

2023-04-08 11:11:47 149 1

原创 【面试题】【C++】简述一下 C++ 的重载和重写?

重载是指不同的函数使用相同的函数名,但是函数的参数个数或者类型不同(参数列表不同)。调用的时候根据函数的参数来区别不同的函数,函数重载和返回值无关。重写也叫覆盖,是指在派生类中重新对基类中的虚函数进行实现。即函数名和参数都一样,只是函数的实现方式不一样,

2023-04-08 09:29:38 67 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除