- 博客(80)
- 收藏
- 关注
原创 Linux Posix API与网络协议栈知识总结
第一次握手:第二次握手:第三次握手:连接建立:TCP四次挥手用于可靠断开连接,确保双方通信结束且数据传输完整:关键点:挥手的核心是双方分别关闭发送数据的通道。TCP 建立连接时,需要确保通信双方能够进行可靠的数据传输,并且双方的初始序列号(Sequence Number)能够同步。这是一个双向确认的过程:第一次握手:第二次握手:第三次握手:TCP 连接是全双工的,即通信双方可以独立地发送和接收数据。断开连接时,需要分别关闭这两个方向的通道,因此需要四次挥手:第一次挥手:第二次挥手:第三次挥手:第四次挥手:T
2024-12-16 15:15:15
1102
原创 C++ 位运算和std::bitset
是 C++ 标准库中强大的位操作工具,它封装了常见的位运算,提升了可读性和安全性,非常适合用于布尔状态管理、位掩码操作和状态压缩等场景。它封装了底层的位操作逻辑,提供了更高的抽象和易用性。它们的操作基于二进制,因此执行速度非常快,广泛应用于嵌入式开发、算法优化和性能敏感场景。是 C++ 标准库中提供的一个模板类,用于管理和操作固定大小的。提供了一系列方法来操作位集合,涵盖了几乎所有常见的位操作需求。两个位有一个为1时,结果为1,否则为0(两个位都为1时结果为1,否则为0((补充一下逻辑或 || (
2024-11-25 13:53:58
1262
原创 C++ 数据结构 静态顺序表、动态顺序表。
静态顺序表(Static Array List)是一种线性数据结构,通常用数组实现。它具有固定的大小,并在编译时分配内存。以下是静态顺序表的一些基本概念和实现示例。
2024-11-01 11:04:53
790
原创 C++ 网络编程 IO多路复用、select、poll、epoll知识点总结
阻塞 I/O:简单易用,但对于大量连接会导致性能问题。多线程:适合高并发场景,但资源消耗大。I/O 多路复用:在处理高并发连接时资源利用高效,代码结构较清晰,但复杂性有所增加。
2024-10-29 15:26:14
1650
1
原创 C++ 内存管理 堆和栈、内存泄漏、内存分配、指针与内存、智能指针、malloc和free、new和delete、内存对齐、内存映射文件、内存分区、内存碎片等知识
堆上分配:通过私有构造函数和静态工厂方法实现,防止直接实例化。这样,用户只能通过提供的方法在堆上创建对象。栈上分配:禁用new和delete操作符,确保实例只能在栈上创建,无法在堆上分配。C++ 的内存模型是一套规则,描述了多线程环境中对内存的操作如何在程序中传播和排序。这些规则在C++11引入,以明确处理多线程中的数据一致性和可见性,确保在并发环境下的代码能表现出可预测的行为。C++ 内存模型主要与内存的可见性(即某个线程的更改对其他线程何时可见)和指令重排有关。内存碎片。
2024-10-25 11:23:26
1226
原创 C++ 面向对象知识汇总(超详细)
在C++中,类(Class)是一种用户定义的数据类型,用来描述具有相同特征和行为的一组对象。类是面向对象编程(OOP)的核心概念,它通过将数据和操作封装在一起,提供了创建复杂程序的工具。类通常由类声明和类定义两部分组成。public:private:// 创建对象// 设置对象的值// 获取对象的值return 0;动态多态通过虚函数和继承机制,让程序在运行时能够根据对象的实际类型选择合适的函数执行,从而提高代码的灵活性和扩展性。类的继承。基类的函数必须是虚函数。
2024-10-24 11:20:23
1559
原创 C++STL面试题笔记 01 vector、list
通过动态数组实现元素的连续存储,当容量不足时,会自动扩展内存,并将现有元素拷贝到新的内存块。为了减少内存重新分配和数据拷贝的开销,可以通过reserve()预分配足够的内存空间,尤其在你预知需要存储大量数据时。由于vector元素连续存储,支持常数时间的随机访问,并且可以通过指针或下标直接遍历,这使得它在需要频繁访问和遍历的场景中非常高效。扩容机制:当vector容量不足时,它会自动重新分配更大的连续内存空间,通常是当前容量的两倍,并将现有元素复制到新空间。性能影响。
2024-10-22 15:46:05
1685
原创 C++ 基础-面试题03(智能指针、右值引用、悬挂指针和野指针、指针常量和常量指针、句柄和指针的区别和联系、sharedptr,uniqueptr,weakptr,autoptr)
智能指针(Smart Pointer)是 C++ 标准库中的一种特殊对象,用来自动管理动态分配的内存。智能指针在对象生命周期结束时自动释放内存,避免手动管理指针可能导致的内存泄漏或野指针等问题。C++ 11 引入了标准库中的三种主要智能指针,分别是和,它们通过 RAII(Resource Acquisition Is Initialization)机制管理资源。智能指针通过 RAII 机制管理动态内存的生命周期,避免手动管理内存带来的复杂性。unique_ptr。
2024-10-18 18:18:19
1057
原创 C++ 基础-面试题02(final和override关键字、sizeof和strlen区别、strcpy、sprintf 与memcpy 的区别、volatile作用、指针和引用的区别等)
特性宏定义(#define函数处理方式预处理器的文本替换编译器生成实际的机器代码类型检查无类型检查,纯文本替换有严格的类型检查执行效率没有函数调用开销,但有重复计算风险有调用开销,但支持内联函数调试难度难以调试,宏替换后不生成调试信息易于调试,有明确的调用栈和调试信息作用域全局作用域,没有局部作用域控制遵循 C++ 作用域规则表达能力灵活,能处理文本替换、常量、表达式更灵活,支持复杂逻辑、控制流、递归等维护性难以维护,容易引入隐藏错误容易维护,逻辑清晰可复用宏定义。
2024-10-18 16:54:49
642
原创 C++ 基础-面试题01(C和C++区别、C结构体和C++结构体区别、C和C++ static区别、a和&a区别、#define和const区别、静态链接和动态链接区别、变量声明和定义区别)
a:表示变量的值,即变量中存储的数据。&a:表示变量的地址,即该变量在内存中的位置。表示内容a&a含义变量的值变量的地址类型变量类型(如int指针类型(如int*示例(int a = 10;a表示 10&a表示存储a的内存地址使用场景用于直接操作变量的数据用于获取变量的地址,赋值给指针等通过&a获取变量的地址可以使程序在指针层次上进行更加灵活的内存操作,例如动态内存管理、函数传参等。
2024-10-18 15:44:56
861
原创 C++11的新特性
默认情况下,对于以值传递方式引入的外部变量,不允许在 lambda 表达式内部修改它们的值(可以理解为这部分变量都是const 常量)。值得一提的是,如果 lambda 函数体内只有一个 return 语 句,或者该函数返回void,则编译器可以自行推断出返回值类型,此情况下可以直接省略"-> 返回值类型"。注意:对于以值传递方式引入的外部变量,lambda 表达式修改的是拷贝的那一份,并不会修改真正的外部变量;,列表初始化也会调用相应的构造函数,而不会进行拷贝,这在有私有拷贝构造函数的情况下尤其重要。
2024-10-16 11:06:03
885
原创 C++ STL迭代器、resize和reserve区别、map和unordered_map区别,vector和List区别、map和set区别、push_back和emplace_back区别
迭代器封装了指针,是一个”可遍历STL( Standard Template Library)容 器内全部或部分元素”的对象,本质是封装了原生指针,是指针概念的一种提升,提供了比指针更 高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,--等操作。因此,元素 的排列顺序是无序的。2. 对于关联容器map,set来说,使用了erase后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素,不会影响下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可;
2024-10-16 09:27:31
1399
原创 C++ STL 组成部分、常见容器和原理、空间适配器、迭代器。
迭代器封装了指针,是一个”可遍历STL( Standard Template Library)容 器内全部或部分元素”的对象,本质是封装了原生指针,是指针概念的一种提升,提供了比指针更 高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,--等操作。2. 对于关联容器map,set来说,使用了erase后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素,不会影响下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。基于哈希表实现,元素的顺序无关紧要。
2024-10-15 11:45:53
934
原创 C++ 多态、虚析构、模板类、常函数、虚继承、虚函数和纯虚函数相关知识和问题总结
常函数const成员函数)是在函数声明时,在函数名之后添加const关键字,表明该函数不会修改对象的任何成员变量。常函数的示例private:int value;public:int getValue() const { // 常函数value = v;// 非常函数,可以修改成员变量作用常函数的主要作用是保证对象的状态不会在函数中被改变,尤其是在使用const对象时。如果一个对象是常量(const),则只能调用常函数,无法调用非常函数。
2024-10-15 10:14:35
1388
原创 C++ 面向对象、特征、重载和重写、构造和析构、向上和向下转型、深浅拷贝。
重载是通过改变参数列表来实现相同函数名的不同功能,适用于同一作用域中。重写是子类对父类虚函数的重新定义,适用于继承关系,并且通常伴随着多态的实现。编译时 vs 运行时:重载是编译时行为,重写是运行时行为。特性重载(Overloading)重写(Overriding)时机编译时运行时作用域同一类或全局范围继承关系中的子类和父类参数要求参数类型、数量或顺序不同与父类方法签名完全一致虚函数无需虚函数必须是虚函数或纯虚函数主要功能通过不同参数处理相同逻辑子类修改父类的行为。
2024-10-15 09:16:15
1025
原创 C++ 内存 堆和栈的区别、内存管理、程序的内存区域(Section)和启动过程、内存对齐的使用场景
特点栈(Stack)堆(Heap)内存分配自动分配手动分配分配方式LIFO(后进先出)随机分配管理机制由操作系统或编译器自动管理由程序员手动管理大小通常较小通常较大分配速度快较慢生命周期作用域结束自动释放需手动释放,否则内存泄漏常见错误栈溢出内存泄漏、悬挂指针这种区别使得栈适用于小且生命周期明确的数据,堆则适用于需要在运行时动态管理内存的数据。C++ 的内存管理需要程序员手动管理堆上的内存,这虽然带来了灵活性,但也带来了复杂性和潜在的内存管理问题。
2024-10-12 16:52:21
1496
原创 extern “C“ 的作用、C++ 和 C 编译的不同、C++ 编译过程的五个主要阶段
extern "C":用于告诉 C++ 编译器按照 C 的方式处理函数的链接,使 C++ 和 C 代码能够互相调用。C++ 编译和 C 编译的不同名称修饰:C++ 编译器会进行名称修饰,以支持函数重载和其他高级功能,而 C 编译器不会。链接规则:C++ 链接时处理更复杂的符号,而 C 语言保持简单的函数名。常见使用场景C++ 调用 C 库时需要extern "C"。提供 C++ 库接口给 C 语言使用时,也需要使用extern "C"。
2024-10-12 14:41:37
1077
原创 C++ include头文件的顺序以及双引号““和尖括号<>的区别
include "MyClass.h" // 当前目录查找#include "subfolder/Helper.h" // 指定子文件夹查找#include <iostream> // 系统库查找,标准C++库#include <cmath> // 系统路径下的数学库在这个例子中,和都是项目内的文件,编译器会从源文件所在的目录或项目结构中的路径查找。<iostream>和<cmath>是标准库的头文件,因此编译器直接在标准路径中查找。双引号""
2024-10-12 14:00:47
2289
原创 C++ struct 和 class 的区别、C++结构体和C结构体的区别等基础知识。
structclassstruct在C++中,struct和class是两种非常相似的用户定义类型,二者有一些关键区别。C++的struct与 C 语言中的struct也存在一些差异,主要是因为 C++ 提供了面向对象编程的特性。
2024-10-12 13:48:59
582
原创 MySQL C/C++ 的 API
我们将实现一个图书馆管理系统,通过控制台界面与用户交互,支持对用户、图书、借阅信息的全面管理。用户角色权限管理(管理员和普通用户)预定与借阅图书的操作图书库存检查与批量入库日志记录(操作记录)数据持久化(本地数据库)
2024-10-11 15:01:56
1701
原创 C++ MySQL (初识)
定义: 数据库是一个结构化的数据集合,用于存储、管理和检索数据。它可以看作是一个电子存储的容器,里面包含了多个表、视图、存储过程和其他对象。数据库通常用于组织和保存大量的信息,以便快速高效地访问。特点数据结构: 数据以表格的形式存储,表由行和列组成。数据管理: 数据库提供了一种机制来插入、更新、删除和查询数据。关系性: 在关系型数据库中,数据表之间可以通过外键建立关系,从而形成更复杂的数据结构。类型关系型数据库(RDBMS): 使用表格来存储数据(如 MySQL、PostgreSQL、Oracle)
2024-10-09 15:42:35
1311
原创 C++ 线程池设计
执行任务 (Task::execute) |-------------------------------------->+---------------------+| 添加任务到TaskManager|---------------------------------------->+-----------------------+// 模拟I/O操作。+-------------------------+ 任务执行后,调用回调函数。// 通知所有等待中的线程,防止它们一直阻塞。
2024-10-08 09:22:18
1037
原创 C++ 互斥锁、自旋锁和原子操作
目的:用于保护临界区,确保同一时刻只有一个线程可以访问共享资源。适合对复杂数据结构的保护。优点简单易用,符合 RAII 原则,确保资源的自动释放。能够处理复杂的线程同步场景。缺点可能导致上下文切换,增加开销。在高竞争情况下,线程可能会被阻塞,影响程序的响应性。使用场景:适合保护对复杂数据结构的操作,或者临界区较长的场景。
2024-10-02 16:08:15
1473
原创 C++ 状态机
在 C++ 中,状态机是一种设计模式,用于管理对象的状态及其状态之间的转换。它常用于系统中状态复杂且有多个状态切换的场景,如嵌入式系统、游戏开发、协议解析等。状态机可以帮助你更好地组织代码,简化状态切换的逻辑和维护。
2024-09-30 16:29:36
1540
原创 C++ 单链表、双链表和循环链表
单链表是一种线性数据结构,由一系列节点构成。每个节点包含数据部分和指向下一个节点的指针,最后一个节点的指针指向nullptr。双链表是一种线性数据结构,每个节点包含数据、指向下一个节点的指针和指向前一个节点的指针。循环链表是一种特殊的链表,最后一个节点的指针指向头节点,形成一个循环结构。
2024-09-29 14:28:46
1247
原创 C++ 静态顺序表和动态顺序表
定义:静态顺序表是一种线性表的实现方式,采用一段连续的内存空间存储数据元素,具有固定的大小。在编译时确定长度,无法动态扩展。定义:动态顺序表是一种线性表的实现,能够在运行时动态调整大小,适应数据量的变化。通常使用动态数组实现。
2024-09-29 13:23:46
932
原创 C++ 封装、继承、多态和抽象
C++ 的封装通过类和访问控制符实现,确保类的内部状态不会被外部直接修改,从而提高了代码的安全性和可维护性。在设计类时,应该遵循封装的原则,隐藏实现细节,并通过公有接口与外界交互。C++ 中的多态是通过虚函数和继承机制实现的,它使得程序能够在运行时动态地选择合适的函数调用。这种特性使得代码更加灵活和可扩展,但也带来了一些额外的开销,如虚函数表的管理和运行时的动态绑定。同时,开发者在使用多态时要注意对象切片、析构函数的正确使用等问题。抽象类是包含至少一个纯虚函数的类。纯虚函数是没有实现的虚函数,使用= 0。
2024-09-29 09:37:54
1388
原创 C++ 函数模板与类模板知识点总结
模板是 C++ 的一个特性,使得你可以编写与类型无关的代码。模板通过定义类型参数,使得同一段代码可以适用于多种数据类型。基本定义// 函数体示例代码// 定义一个函数模板用于加法// 返回两数之和// T 被推导为 int// T 被推导为 doublereturn 0;基本定义// 成员变量和成员函数// 类模板定义,包含一个类型为 T 的成员变量public:Box(T val) : value(val) {} // 构造函数。
2024-09-28 23:18:52
979
原创 C++ 内存池(Memory Pool)详解
内存池是一种有效的内存管理技术,通过预分配和集中管理内存块,提高了内存分配和释放的效率。尽管它增加了一定的复杂性,但在高性能和实时系统中,它的优势往往是不可忽视的。理解内存池的基本概念、设计思路和使用场景,有助于在适当的地方应用这一技术。
2024-09-27 21:42:46
1820
原创 C++ 指针及内存模型
指针是 C++ 中强大的工具,提供了直接内存访问的能力。正确使用指针和内存管理机制(如newdelete、智能指针)是确保程序安全和高效的关键。理解指针的基本概念、内存管理、函数指针和智能指针是编写健壮 C++ 代码的基础。
2024-09-26 22:40:35
631
原创 C++ <bitset>
bitset>是一个强大的工具,用于处理位操作,特别是在需要高效地管理和操作布尔值的场合。它的各种操作函数使得位操作变得简单直观。理解和掌握bitset可以提升代码的效率和可读性,尤其是在涉及大量布尔值的程序中。
2024-09-26 08:47:48
1365
原创 C++ 存储器
auto范围:局部变量(函数内)生命周期:当程序执行到该变量的声明时分配内存,并在离开变量作用域时释放。使用注意:C++11 之后,auto主要用于自动类型推导,而不是存储类说明符。register范围:局部变量生命周期:与auto类似。存储位置:尽量存储在 CPU 寄存器中以提高访问速度,但并不保证一定会在寄存器中存储。使用注意:现代编译器一般会自动优化寄存器分配,因此register现在很少使用。static范围:局部变量(函数内)或全局变量(文件范围内)生命周期。
2024-09-25 21:49:45
635
原创 C++ 回调函数
回调函数(Callback Function)是编程中常用的设计模式之一,通常用于异步任务的场景。回调函数的主要作用是在特定事件(例如消息到达、网络响应等)发生时自动执行用户定义的处理逻辑。常见的应用场景包括消息队列、网络通信、定时任务等。回调函数的优点在于它允许灵活的事件处理,让开发者定义在某些事件发生时执行的特定代码。以下内容将介绍回调函数的基础知识、应用场景,并提供详细的注释和示例代码。回调函数是一种函数指针(或函数对象),在特定条件下被调用。在 C++ 中,回调函数可以是普通函数、Lambda 表达
2024-09-25 08:45:09
1313
原创 C++ 适配器 std:bind
std::bind是一个通用的函数适配器,用于创建新的可调用对象,特别适合回调和延迟调用场景。它通过绑定函数的部分参数和使用占位符来灵活构建新的函数。注意在实际使用中,可能需要考虑参数的生存期问题,以及在现代 C++ 中,使用 lambda 表达式往往更加简洁和灵活。
2024-09-24 18:06:40
990
原创 C++ 包装器 std::function
是一个强大的工具,能存储和调用各种类型的可调用对象。它常用于回调机制、事件处理和异步任务等场景。使用时需要注意生命周期问题和性能损耗,避免不必要的拷贝开销。通过合理地使用,可以使代码更加灵活和模块化。
2024-09-24 17:55:38
867
原创 C++ std::atomic 类型详解
是 C++ 提供的一种用于多线程编程的同步原语,保证对数据类型的操作是原子的,即不会被中断或与其他线程产生冲突。它适用于需要在线程之间共享数据而不需要加锁的场景,提供比传统的锁(如std::mutex)更好的性能。是 C++ 中强大的并发工具,适用于避免锁机制带来的性能损耗。需要理解内存顺序模型以及如何选择适合的内存顺序以提高性能。在高并发场景中可能遇到 ABA 问题、伪共享等高级问题,需根据具体需求进行优化。可以结合实现无锁数据结构、线程安全的单例模式和原子引用计数等复杂应用。
2024-09-23 22:07:01
4775
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人