自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++常见STL的底层实现原理

Unorder_map和unorder_set: 使用哈希表将元素映射到元素中,提供了快速的查找,插入和删除。array:固定大小的数组容器,类似于原生数组,底层采用静态数组作为存储结构,提供了数组的各种操作方法。list:双向链表容器,底层由节点组成,每个节点包含元素值和指向后节点的指针,支持高效的插入和删除操作。vector:动态数组容器,底层使用连续的内存块存储元素,支持动态扩展和缩容,通过指针进行访问。set/map: 使用红黑树作为底层实现,保持元素的有序性,提供快速查找,插入和删除。

2024-03-14 23:20:53 432

原创 C++-线程创建

在C++中,线程创建可以通过Windows API 提供的函数CreateThread和CRT 提供的函数_beginthreadex,也可以使用标准库中的thread。

2024-03-06 13:47:28 2300

原创 C++-explicit

在说这这个关键字前,先说说隐式和显式的概念。隐式意味着某些操作或转换是自动发生的,无需程序员直接指定。类型转换:在不同类型之间自动转换,而无需程序员显式指定。默认构造函数:没有为类显式定义任何构造函数时,编译器会自动生成一个默认构造函数。显式操作要求程序员直接指出他们想要执行的确切操作或转换。类型转换:需要明确指出转换的目标类型。构造函数和函数调用:使用关键字或特定语法明确调用。

2024-03-04 09:08:31 358

原创 linux-fork习题

linux下父进程创建子进程后,子进程会复制父进程的用户层空间的数据,实际上子进程继承到的数据只是父进程的副本,所以修改子进程里的数据不会影响到父进程。通过fork产生子进程后,在以下子进程中发生改变的时候不会引起父进程中相应的改变的有()根据结果显示,父进程的局部变量、全局变量、静态变量不会随着子进程的改变而改变。

2024-03-03 21:40:48 439

原创 牛客网C++专项题目整理(2)

在两个线程并发的过程中,a线程对tally加1后,还没有更新tally在内存中的值,线程b读取tally值,执行加1,更新tally为1,然后a线程重新读取tally值,这样交替运行,最终为50 最大值的情况: a线程对tally加到50后,更新tally在内存中的值为50,然后线程b读取tally值,再执行加50运算,结果为100;关于选项 C,重载运算符时,相应的运算符函数名并不一定与运算符本身的符号相同,而是通过运算符函数的命名来定义。5. 下列关于运算符重载的叙述中,正确的是( )

2024-03-03 14:39:48 974

原创 C++模版

在C++中,我们可以使用函数重载来提高代码的灵活性,比如当实现某些相同的功能时,可以重载不同版本的函数,来根据不同的情况实现对应的操作,但是对于每种类型都需要重载一次。而如果使用模版,就可以使代码不再局限于参数的类型,更好的实现代码复用。模版分为函数模版和类模版。

2024-03-03 13:11:06 430

原创 牛客网C++专项题目整理(1)

B 内联函数目的是在代码中直接展开(编译期),而虚函数是为了继承后能动态绑定执行自己的动作(动态绑定),因此本质是矛盾的,因此即使内联函数声明为虚函数,编译器遇到这种情况是不会进行inline展开的,而是当作普通函数来处理。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。6 类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针,则p->A::func()将()?

2024-03-03 10:22:28 1149

原创 C++函数重载和重写

指在同一个类中,方法名相同但参数列表不同(参数数量或参数类型不同)的方法之间的关系。重载使得我们可以定义功能相似但是接受不同参数的方法。重载对于返回值是没有要求的,因为在编译时编译器并不知道函数的返回值是什么,无法根据返回值类型来区分哪个方法应该被调用,也就不知道是不是重载。方法名必须相同。参数列表必须不同(参数数量或参数类型不同)。返回类型和访问修饰符可以不同。可以发生在单个类中,也可以在子类中。在这段代码中,add方法被重载了三次,分别接受两个整数、两个浮点数、三个整数作为参数。

2024-03-03 09:00:34 459

原创 网络-TCP关闭连接(close、shutdown)

在TCP协议中,关闭连接的过程可以通过shutdown函数和close函数来实现。

2024-03-01 22:41:37 931 1

原创 MySql-索引失效的情况

举例来说,如果有一个列 col1 上建立了索引,并且在查询中使用了 col1 * 2 = 10 这样的条件,这种情况下数据库可能无法直接利用 col1 的索引来加速查询,因为需要先对 col1 进行运算,然后才能进行匹配。这就导致了索引失效,从而可能降低查询性能。=时,回表数量可能会很大,也可能产生索引失效。当通配符出现在搜索关键字的开头时,索引失效的主要原因是因为索引是按照值的顺序进行存储和排序的,而通配符 % 出现在开头时,表示需要匹配任意长度的字符串,这样就无法利用索引的有序性进行高效的检索。

2024-02-28 23:23:40 576 1

原创 操作系统-零拷贝

零拷贝技术是一种可以优化数据传输的技术,在传统的数据传输过程中,通常会涉及多次数据拷贝操作,比如从应用程序缓冲区到内核缓冲区,再从内核缓冲区到网络设备缓冲区,造成了额外的CPU和内存开销。而零拷贝技术通过优化数据传输路径,尽量避免或减少这些不必要的数据拷贝操作,提高了数据传输的效率和性能。

2024-02-27 11:10:13 749

原创 操作系统-互斥锁/自旋锁

互斥锁(Mutex)和自旋锁(Spinlock)是用于实现多线程同步的机制。它们的主要区别在于等待资源释放时的不同行为。

2024-02-27 10:31:52 1886

原创 网络—TCP重传机制(超时,快速,SACK)

在 TCP 连接中,如果发送方发送了数据包并在一定时间内未收到确认应答,就会触发超时重传机制,即重新发送该数据包。这样可以确保数据的可靠传输。超时重传时间是RTO首先说一下往返时延RTT(Round-Trip Time),数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。对于RTO的设置一般采用略大于RTT,如果RTO过大,当数据包丢失时需要等待很长时间,才会触发重传,这样会导致效率很低。

2024-02-25 11:36:27 711

原创 操作系统-信号(二)

当一个信号被发送时,他将会被发送到目标进程的内核层中,在内核层中有未决信号集和屏蔽集。未决信号集中的信号是指已经发送到进程但还未被处理的信号,而“未决”这个词则表示该信号正在等待处理,这是对应信号设置为1时的情况。当接收到信号但未决信号集对应的位是0,那么系统就会将该位置1,等到信号开始处理再变回0。当未决信号集是1时,如果是标准信号,不会进行排队,后面的信号将会被丢弃。如果是实时信号,将会按照顺序存入一个队列,当前面的那个信号处理完了,队列首部的信号将会被执行。

2024-02-23 17:29:36 347

原创 操作系统-信号(一)

信号是操作系统中的一种对进程干涉的方式,通过信号可以挂起恢复进程,也可以杀死进程。利用信号也可以实现进程间通信。通过kill -l可以查看信号,一共有64个信号,1-32是经典信号,也称为不可靠信号、标准信号。33-64是自定义信号,也称为可靠信号、实时信号。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做不可靠信号,后面增加的33-64信号被称为可靠信号。在这之中,32,33这两个信号是隐藏的,事实上32也是可靠信号。

2024-02-23 16:11:40 981

原创 本地/网络字节序

网络字节序(Network Byte Order):是一种规定好的字节序,它采用的是大端字节序。因此,在进行网络数据传输时,需要将主机字节序转换为网络字节序,以确保数据按照网络字节序正确地进行传输和解析。在进行网络数据传输时,需要将主机字节序转换为网络字节序,以确保不同计算机之间能够正确解释和处理数据。将16位的无符号短整数从网络字节序转换为主机字节序。将16位无符号短整数从主机字节序转换为网络字节序。将32位的无符号整数从网络字节序转换为主机字节序。将32位无符号整数从主机字节序转换为网络字节序。

2024-02-21 11:34:49 344

原创 静态/动态重定位、静态/动态内存分配

解决内存碎片问题的一种有效的方法是移动内存中所有进程的存储区,使它版们相互邻接并权位于内存的某一端,而把全部空闲区留在另一端,形成一个大的空闲分区,这种技术称为“紧凑”。的支持,存储了当前程序或进程在内存中的基地址,用于动态地调整程序中指令的地址,以实现程序的重定位和正确访问内存中的数据或指令。内存静态分配是指在程序编译阶段确定程序中变量、数组等数据结构的内存大小和位置,这些内存分配是固定的,直到程序结束才会释放。动态重定位使得程序在运行时更加灵活,能够适应不同的内存布局和其他程序的加载情况。

2024-02-21 10:37:07 866

原创 C++关键字-const

另外提一下,const修饰的变量也是和static修饰的变量一样是内部链接性,也一样是在当前文件中有效的。说到修饰常量,#define定义的宏也可以的,那么const和#define主要有什么区别呢。const的功能更多,可以修饰指针,函数,对象等,而#define只能进行文本替换。内部链接性的变量或函数对于其他文件是不可见的,无法通过extern关键字引用。具有外部链接性的变量或函数可以在当前文件以外的其他文件中访问和使用。代表*p指向的内容无法修改,是一个常量指针,表示指针指向的是一个常量。

2024-02-14 10:01:53 366 1

原创 execl()函数族

其中path是要重载的程序的路劲,后面的是程序需要的参数,最后一个参数需是NULL,才能重载.路径一般写绝对路径,这个函数适用于自己编写的程序。

2024-02-13 09:54:06 346 1

原创 进程原语-execl()、wait()

当exit()函数执行的时候,底层调用了_EXIT函数,将进程用户层的数据回收,并且将内核层除了PCB的数据都回收,这样就导致了PCB的内容没有被回收,进而产生僵尸进程。原有的内核层信息不变,但用户层的数据将会被重载的内容覆盖,也就是当execl()返回后,原来的剩余任务将不会再执行,取而代之的是重载后的新任务。当我重载后,可以看到重载前的内容正常输出,重载后的内容输出后就没有再输出原来没输出的内容,这是因为这个进程的用户层数据已经被覆盖了,原来的内容已经不见了。: 如果子进程正常结束,则该宏返回非零值。

2024-02-06 20:29:04 1041 1

原创 进程原语-fork()

在看一下刚才的进程2,在进程2中,&&左边的fork()返回值是父进程的返回值,因此为真,&&右边的返回值是0,因为进程2是这个fork出来的,因此进程二不会短路要去执行||右边的fork,这样以来就会产生一个新的。首先就是刚才的进程1,在进程1中,&&左边的fork()返回值为0,因为他是这个fork出来的子进程,这样根据短路,进程1就要去执行||右边的fork()了,因此会产生一个。fork可以用于进程的创建,在父进程中使用fork()可以创建一个子进程,子进程可以执行fork后面的代码。

2024-02-05 03:17:55 849 1

原创 迭代器失效(二)

这两个不支持扩容,因此不需要考虑扩容的情况,底层实现是红黑树,在进行数据的插入删除时应该是会改变节点的指向,但并不会改变节点的地址,也就意味着不会发生和vector一样因插入删除改变元素的位置而导致的迭代器失效。在双端队列中,无论是扩容还是插入(头插尾插中间插)都会导致迭代器的失效,只有当删除头尾的时候不会导致中间位置的迭代器失效,删除中间的位置都会导致迭代器失效。在上篇文章中提到了关于在vector和list中的迭代器失效的情况,但是STL中的容器种类是非常多的,因此还需要再补充一些。

2024-02-04 00:46:48 330 1

原创 C++11特性:Lambda表达式

Lambda 表达式,也称为匿名函数,允许定义一个没有名称的函数表达式。Lambda 表达式特别适用于编写简短的回调函数或实现简单的操作,而不需要正式定义一个函数。在这里说一下什么是回调函数回调函数是一个通过参数传递给另一个函数,并在那个函数内部被执行的函数。这种机制允许程序在特定的时刻或条件下,自动调用某个函数。回调函数是一种在编程中广泛使用的概念,尤其在异步编程、事件监听和某些设计模式中特别常见。一般使用函数指针作为参数来调用回调函数实现。回调函数相比于直接调用函数主要有以下优点。

2024-02-03 22:22:14 2081 1

原创 静态库、动态库

复习到这,只有零星的记忆了emo。

2024-02-02 00:21:58 495

原创 虚拟内存/虚拟存储器

虚拟存储器在有些书上也叫虚拟内存(也就是说虚拟内存和虚拟存储器是同一个东西),个人觉得虚拟存储器这一名称更偏向于一种存储机制。而从字面意义上来说虚拟内存就是在磁盘上分配的不在物理内存的虚拟的内存。

2024-02-01 05:12:27 911

原创 类的静态成员变量/函数的调用

普通成员函数调用静态变量/函数通过类名作用域可直接调用,静态成语函数可以直接调用静态成员变量,但无法直接调用普通成员函数/变量,可以通过对象间接调用。

2024-01-26 23:09:47 685

原创 迭代器失效

迭代器在容器中迭代器失效情况

2024-01-25 01:35:42 335

空空如也

空空如也

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

TA关注的人

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