
春招面试冲刺
文章平均质量分 94
ChoSeitaku
是一名在校大学生,目前在做C语言、C++、蓝桥杯、算法、考研数学、408的内容,后期会做深度学习、机器学习、神经网络、人工智能、AIGC、WEB3、开发相关的内容
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
NO.20|操作系统|多线程多进程|互斥锁|信号量|进程线程中断切换|自旋锁互斥锁|多线程单线程|sleep|wait|线程池|零拷贝|epoll|select|多路IO复用|socket|网络模型
概念:信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。原理:由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),具体的行为如下:(1)P(sv)操作:如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行(信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位)。原创 2025-04-02 10:22:17 · 779 阅读 · 0 评论 -
NO.19|操作系统|进程空间|并发并行|线程协程|fork|僵尸进程|守护进程|进程通信|进程同步|进程调度算法|进程状态|mmap|互斥量|常见信号|线程通信|线程同步|死锁|进程线程对比
孤儿进程:是指一个父进程退出后,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并且由init进程对它们完整状态收集工作。僵尸进程:是指一个进程使用fork函数创建子进程,如果子进程退出,而父进程并没有调用wait() 或者waitpid()系统调用取得子进程的终止状态,那么子进程的进程描述符仍然保存在系统中,占用系统资源,这种进程称为僵尸进程。原创 2025-04-01 22:18:38 · 777 阅读 · 0 评论 -
NO.18|操作系统|命令|文件权限|软链接|硬链接|静态库|动态库|GDB|大端小端|进程调度算法|内存|用户系统态|LRU|线程|页表|缺页中断|虚拟内存|物理内存|虚拟地址|堆栈|malloc
GDB调试:gdb调试的是可执行文件,在gcc编译时加入 -g ,告诉gcc在编译时加入调试信息,这样gdb才能调试这个被编译的文件 gcc -g tesst.c -o testquit:退出gdb,结束调试list:查看程序源代码list 5,10:显示5到10行的代码list test.c:5, 10: 显示源文件5到10行的代码,在调试多个文件时使用list get_sum: 显示get_sum函数周围的代码。原创 2025-03-25 10:00:58 · 785 阅读 · 0 评论 -
NO.16|C++新特性|智能指针|右值引用|转移语义|weak_ptr|shared_ptr|四种类型转换|auto|可变参数模板|Lambda函数
此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是:存在潜在的内存崩溃问题。(2)unique_ptr(替换auto_ptr)unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露,例如,以new创建对象后因为发生异常而忘记调用delete时的情形特别有用。采用所有权模式,和上面例子一样编译器认为P4=P3非法,避免了p3不再指向有效数据的问题。因此,unique_ptr比auto_ptr更原创 2025-03-23 20:17:18 · 990 阅读 · 0 评论 -
NO.15|C++新特性|初始化|auto|decltype|智能指针shared_ptr|空指针nullptr|范围for|右值引用|move|无序容器哈希表|正则表达式|Lambda表达式
可以看到,它们的形式都是统一的。这里需要注意的是,a3 虽然使用了等于号,但它仍然是列表初始化,因此,私有的拷贝构造并不会影响到它。这很容易理解,auto 是根据变量的初始值来推导出变量类型的,如果不初始化,变量的类型也就无法推导了。auto 根据"=“右边的初始值 value 推导出变量的类型,而 decltype 根据 exp 表达式推导出变量的类型,跟”="右边的 value 没有关系。注意:对于以值传递方式引入的外部变量,lambda 表达式修改的是拷贝的那一份,并不会修改真正的外部变量;原创 2025-03-23 17:18:59 · 975 阅读 · 0 评论 -
NO.14|C++STL|动态链接|map|unordered_map|vector|list|set|push_back|emplace_back(C++)
如果要将一个临时变量push到容器的末尾,push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,而emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。特点:元素在堆中存放,每个元素都是存放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问。优点:和数组类似开辟一段连续的空间,并且支持随机访问,所以它的查找效率高其时间复杂度。原创 2025-03-23 15:51:27 · 871 阅读 · 0 评论 -
NO.13|C++STL|基本组成部分|容器|map|hashtable|deque|list|allocator|迭代器|resize|reserve(C++)
顺序容器容器并非排序的,元素的插入位置同元素的值无关。包含vector、deque、list,具体实现原理如下:(1)vector 头文件动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。(2)deque 头文件双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(仅次于vector)。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。(3)list 头文件双向链表。元素在内存不连续存放。原创 2025-03-23 13:03:47 · 954 阅读 · 0 评论 -
NO.12|C++面向对象|虚方法|拷贝构造函数|权限|抽象类|多态|虚析构函数|虚基类|拷贝赋值|移动赋值|类模板|模板类|虚函数表(C++)
多态是面向对象的重要特性之一,它是一种行为的封装,就是不同对象对同一行为会有不同的状态。(举例 : 学生和成人都去买票时,学生会打折,成人不会)多态是以封装和继承为基础的。在C++中多态分为静态多态(早绑定)和动态多态(晚绑定)两种,其中动态多态是通过虚函数实现,静态多态通过函数重载实现,代码如下class Apublic:参考回答在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,代码如下:class A虚继承的类可以被实例化,举例如下Liger lg。原创 2025-03-23 10:40:54 · 640 阅读 · 0 评论 -
NO.11|C++面向对象|虚析构|虚构造|模板类|派生类|移动构造函数|引用数据成员|虚函数|常函数|虚继承|纯虚函数|菱形继承
不能用默认构造函数初始化,必须提供构造函数来初始化引用成员变量。否则会造成引用未初始化错误。构造函数的形参也必须是引用类型。不能在构造函数里初始化,必须在初始化列表中进行初始化类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加const,而对于改变数据成员的成员函数不能加 const。原创 2025-03-22 22:09:45 · 655 阅读 · 0 评论 -
NO.10|C++面向对象|三大特征|重载|重写|构造函数|初始化顺序|向上转型|向下转型|深拷贝|浅拷贝|多态(C++)
面向对象是一种编程思想,把一切东西看成是一个个对象,比如人、耳机、鼠标、水杯等,他们各自都有属性,比如:耳机是白色的,鼠标是黑色的,水杯是圆柱形的等等,把这些对象拥有的属性变量和操作这些属性变量的函数打包成一个类来表示面向过程和面向对象的区别面向过程:根据业务逻辑从上到下写代码面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程只定义了析构函数,编译器将自动为我们生成拷贝构造函数和默认构造函数。默认构造函数和初始化构造函数。原创 2025-03-21 22:19:10 · 872 阅读 · 0 评论 -
NO.9|C++内存|堆和栈|内存管理|malloc和局部变量|程序section启动过程|全局变量|内存泄漏|atomoic|内存模型|内存对齐
简单地说就是申请了一块内存空间,使用完毕后没有释放掉。(1)new和malloc申请资源使用后,没有用delete和free释放;(2)子类继承父类时,父类析构函数不是虚函数。(3)Windows句柄资源使用后没有释放。原创 2025-03-19 21:44:41 · 647 阅读 · 0 评论 -
NO.8|C++语言基础|静态变量|局部变量|内联函数|宏函数|i++|++i|new|malloc|const|define|函数指针|指针函数|指针|C++传值|const*|*const
当开辟的空间小于 128K 时,调用 brk()函数;当开辟的空间大于 128K 时,调用mmap()。malloc采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。值传递用于对象时,整个对象会拷贝一个副本,这样效率低;而引用传递用于对象时,不发生拷贝行为,只是绑定对象,更高效;而define用于定义宏,而宏也可以用于定义常量。原创 2025-03-18 22:07:04 · 692 阅读 · 0 评论 -
NO.7|C++语言基础|特点|区别|结构体|关键字|编译|数组和指针|函数指针|静态变量|成员函数|野指针(C++)
参考回答概念:函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。定义形式如下:f = &func;函数指针的应用场景:回调(callback)。我们调用别人提供的 API函数(Application Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫Callback。概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)原创 2025-03-17 21:48:42 · 708 阅读 · 0 评论 -
NO.6.STL容器和算法|allocator|序列式容器|vector|map|set|STL迭代器|resize|reserve
STL ⼀共提供六⼤组件,包括容器,算法,迭代器,仿函数,配接器和配置器,彼此可以组合套⽤。容器通过配置器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以应⽤于容器、 仿函数和迭代器。容器: 各种数据结构,如 vector, list, deque, set, map,⽤来存放数据, 从实现的⻆度来讲是⼀种类模板。算法: 各种常⽤的算法,如 sort(插⼊,快排,堆排序), search(⼆分查找), 从实现的⻆度来讲是⼀种⽅法模板。原创 2025-03-11 20:21:39 · 616 阅读 · 0 评论 -
NO.5类和数据抽象|类和继承|组合|抛异常|静态分配动态分配|成员初始化列表|析构函数扩展|构造函数执行扩展|虚函数
has-A 包含关系,⽤以描述⼀个类由多个部件类构成,实现 has-A 关系⽤类的成员属性表示,即⼀个类的成员属性是另⼀个已经定义好的类;use-A,⼀个类使⽤另⼀个类,通过类之间的成员函数相互联系,定义友元或者通过传递参数的⽅式来实现;is-A,继承关系,关系具有传递性;⼀个类⾥⾯的数据成员是另⼀个类的对象,即内嵌其他类的对象作为⾃⼰的成员;创建组合类的对象:⾸先创建各个内嵌对象,难点在于构造函数的设计。创建对象时既要对基本类型的成员进⾏初始化,⼜要对内嵌对象进⾏初始化。原创 2025-03-11 14:30:27 · 463 阅读 · 0 评论 -
NO.4|C++语言基础|静态动态绑定|深浅拷贝|拷贝构造|内存对齐|内存泄漏|平衡二叉树|红黑树|defineconsttypedefinline|forkwaitexec|编译|链接|联编
说起静态绑定和动态绑定,我们⾸先要知道静态类型和动态类型,静态类型就是它在程序中被声明时所采⽤的类型,在编译期间确定。动态类型则是指“⽬前所指对象的实际类型”,在运⾏期间确定。内存泄漏简单的说就是申请了⼀块内存空间,使⽤完毕后没有释放掉。它的⼀般表现⽅式是程序运⾏时间越⻓,占⽤内存越多,最终⽤尽全部内存,整个系统崩溃。由程序申请的⼀块内存,且没有任何⼀个指针指向它,那么这块内存就泄漏了。原创 2025-03-10 09:52:55 · 554 阅读 · 0 评论 -
NO3.C++语言基础|堆和栈|函数传参|newdeletemallocfree|volatileextern|defineconst|三大特性|虚函数|构造函数|析构函数
虚函数调⽤只需要知道“部分的”信息,即只需要知道函数接⼝,⽽不需要知道对象的具体类型。但是,我们要创建⼀个对象的话,是需要知道对象的完整信息的。特别是,需要知道要创建对象的确切类型,因此,构造函数不应该被定义成虚函数;⽽且从⽬前编译器实现虚函数进⾏多态的⽅式来看,虚函数的调⽤是通过实例化之后对象的虚函数表指针来找到虚函数的地址进⾏调⽤的,如果说构造函数是虚的,那么虚函数表指针则是不存在的,⽆法找到对应的虚函数表来调⽤虚函数,那么这个调⽤实际上也是违反了先实例化后调⽤的准则。原创 2025-03-08 22:48:30 · 818 阅读 · 0 评论 -
NO2.C++语言基础|C++和Java|常量|重载重写重定义|构造函数|强制转换|指针和引用|野指针和悬空指针|const修饰指针|函数指针(C++)
对于局部常量,存放在栈区;对于全局常量,编译期⼀般不分配内存,放在符号表中以提⾼访问效率;字⾯值常量,⽐如字符串,放在常量区翻译⾃ overload,是指同⼀可访问区内被声明的⼏个具有不同参数列表的同名函数,依赖于C++函数名字的修饰会将参数加在后⾯,可以是参数类型,个数,顺序的不同。根据参数列表决定调⽤哪个函数,重载不关⼼函数的返回类型。原创 2025-03-06 22:36:06 · 1026 阅读 · 0 评论 -
NO1.C++语言基础|四种智能指针|内存分配情况|指针传参和引用传参|const和static|c和c++的区别
static作用:控制变量的存储方式和可见性修饰局部变量一般局部变量存放在栈区,并且语句块执行结束时生命周期也结束;修饰之后会存放在静态数据区,生命周期会一直持续到程序结束。其中局部变量的作用域没有改变修饰全局变量全局变量可以在本文件和同一工程中的其他源文件访问,修饰后改变了作用域范围,从整个工程可见变为本文件可见修饰函数和修饰全局变量类似,也是改变了函数的作⽤域修饰类修饰类中的函数,表示该函数属于⼀个类⽽不是属于此类的任何特定对象。原创 2025-03-05 22:57:14 · 703 阅读 · 0 评论