- 博客(22)
- 收藏
- 关注
原创 C++关键字总结
本文总结了C++中的关键特性,分为七大类:类与对象(如class/struct、继承权限控制、虚函数)、构造与析构(如default/delete、new/delete)、函数相关(如inline、constexpr)、内存管理(如const、volatile)、类型转换(如static_cast、dynamic_cast)、模板与泛型(如可变参数模板),以及其他重要特性(如内存对齐、命名空间)。重点介绍了C++11新增的关键字(override、final、noexcept等)及其应用场景,通过代码示例展
2025-08-24 09:39:35
888
原创 C++11特性——智能指针之std::shared_ptr 、std::weak_ptr
摘要:C++智能指针shared_ptr和weak_ptr通过引用计数管理对象生命周期。shared_ptr允许多指针共享对象所有权,当引用计数归零时自动释放对象;weak_ptr作为观察者不增加引用计数,避免循环引用。推荐使用make_shared创建shared_ptr,因其将对象与控制块一次性分配,更高效安全。weak_ptr需通过lock()转换为shared_ptr才能访问对象,防止悬空指针。文中还介绍了智能指针的常见陷阱(如循环引用、裸指针重复构造)和解决方案,以及make_shared/mak
2025-08-17 17:00:00
652
1
原创 C++11特性——智能指针之unique_ptr
注:不可复制,但可移动,是unique_ptr和 shared_ptr 最大的区别之一,禁用拷贝构造,是为了避免两个 unique_ptr 同时指向同一块内存 → 双重释放。默认 unique_ptr 用 delete 删除对象,但有时我们需要特殊的释放方式,比如:free() 而不是 delete、关闭文件句柄、释放网络连接。只有一个 unique_ptr 可以指向该对象、不可复制(拷贝构造/赋值被删除)、可以移动(std::move)、离开作用域时,自动释放内存。// RVO 或移动。
2025-08-08 08:21:56
500
原创 C++11特性——右值引用与移动语义
本文介绍了C++中的右值引用与移动语义。左值具有持久存储,右值为临时对象。右值引用(&&)允许区分临时对象,优化性能避免拷贝。std::move将对象转为右值引用触发移动语义,std::forward在模板中完美转发参数类型。移动构造函数和移动赋值运算符通过资源转移而非拷贝提升效率,使用noexcept保证安全。完美转发通过转发引用(T&&)保持参数原始值类别,结合引用折叠规则实现参数类型无损传递。这些机制共同优化了资源管理,提高了程序运行效率。
2025-07-31 18:00:42
839
原创 C++11特性——变量与初始化
本文介绍了C++11中关于变量与初始化的五个重要特性:1. auto类型推导:自动推断变量类型,简化代码,特别适用于容器迭代器和lambda表达式;2. 统一初始化列表{}:提供一致的初始化语法,增强类型安全,禁止隐式窄化转换;3. decltype类型推导:获取表达式的类型而不求值,常用于模板编程和复杂类型表达;4. nullptr:替代NULL关键字,解决指针初始化歧义问题,提升类型安全;5. 强类型枚举(enum class):限制枚举作用域,禁止隐式转换,避免枚举值冲突。这些特性使C++代码更安全、
2025-07-31 13:16:19
898
原创 C++容器适配器
封装逻辑:封装 push_back()、pop_front()、front()、back()。底层容器:vector + make_heap / push_heap / pop_heap。封装逻辑:封装了底层容器的 push_back()、pop_back()、back() 等。// 入栈(调用底层容器的 push_back)// 入队(调用底层容器的 push_back)// 出队(调用底层容器的 pop_front)// 出栈(调用底层容器的 pop_back)// 访问栈顶元素(底层的 back)
2025-07-30 11:17:59
551
原创 STL 关联容器
std::unordered_set 是一个值的哈希表,值本身就是 key。其中,std::unordered_set、std::unordered_multiset、std::unordered_map。与顺序容器(如 std::vector、std::deque 等)不同,关联容器中的元素是通过。(C++11起)std::unordered_set、std::unordered_multiset。(C++11起)std::unordered_map、std::unordered_multimap。
2025-07-29 12:28:19
717
原创 C++顺序容器
std::deque(双端队列)是 C++ 标准库中的一种 顺序容器,与 std::vector 类似,但它有一个显著的不同点:deque 支持在两端(前端和后端)进行高效的插入和删除操作。4.数组与容器接口兼容:尽管 std::array 只是一个固定大小的数组,它依然符合 STL 容器的设计原则,提供类似于其他 STL 容器的操作接口,如 begin()、end()、size()、at() 等。deque 使用 不连续的内存分配,而是将内存块分散在内存中,每个块的大小通常是固定的。
2025-07-20 16:57:26
967
原创 C++封装、多态、继承
摘要:C++三大特性封装、继承和多态的核心机制解析。封装通过类作用域和访问控制符实现数据隐藏;继承建立"is-a"关系,子类对象内存布局包含父类成员;多态依赖虚函数表(vtable)实现动态绑定,运行时通过虚表指针(vptr)查找函数地址。其中,封装使用private/protected/public控制访问权限,继承通过三种访问方式改变成员可见性,多态必须基于虚函数和指针/引用才能实现运行时绑定。底层实现上,虚函数机制会为每个类生成虚表,对象头部插入虚表指针,重写函数会更新虚表项。
2025-07-13 21:43:41
767
原创 Linux 网络编程套接字
在每一个IP数据包的首部(Header)中,包含两个关键字段:源IP地址(Source IP Address) 和 目标IP地址(Destination IP Address),它们共同标识了数据包的发送方和接收方。UDP(用户数据报协议)是一个轻量级的传输层协议,它和 TCP 一样,也建立在 IP 协议之上。网络编程中的地址转换函数主要用于 字符串地址(如 "127.0.0.1") 和二进制地址(如 in_addr 结构体)之间的相互转换,它们常用于设置 socket 地址和打印对端地址。
2025-04-12 11:34:04
1243
原创 Linux网络基础
(Internet Protocol version 6):由于IPv4地址空间有限,IPv6为每个设备提供了更多的地址,使用128位表示,通常以八组16进制数表示(如:2001:0db8:85a3:0000:0000:8a2e:0370:7334)。(Internet Protocol version 4):由四个8位(即1字节)组成,总共32位,通常以四个十进制数表示,范围从0到255(如:192.168.1.1)。:用于局域网(LAN)内部设备之间的通信,不能直接在互联网中使用。
2025-04-08 15:49:23
864
原创 Linux线程池
例如,应用程序的配置类或设置类,如果每次都创建新的实例,会导致全局状态不一致,使用单例模式可以确保只有一个配置对象在管理这些全局状态。单例模式提供了一个全局唯一的对象实例,通过一个静态方法来获取这个实例,使得程序中的其他部分可以通过这个全局访问点访问单一实例,而无需重复创建对象。示例:数据库连接池通常会使用单例模式来确保所有的请求都使用一个共享的连接池,避免了创建过多的连接带来的性能损耗。示例:比如,你的应用程序需要访问日志文件管理器,只需一个日志对象,不需要每次都创建新的对象,避免了重复操作。
2025-04-07 20:30:24
1015
原创 Linux生产消费者模式
信号量的值会减少1。如果信号量的值为0,则表示没有资源或其他线程或进程已经在执行临界区的任务,此时调用sem_wait()的线程或进程会被阻塞,直到信号量值大于0。通过sem_post()操作,信号量的值增加,并可能通知其他等待的线程或进程它们可以继续执行。环形队列的原理基于一个数组,通过设计使得队列的头部和尾部在一个固定的数组范围内循环,避免了传统队列因空间满而无法继续存储数据的问题。当信号量的值为0时,表示没有资源或无法进入临界区,调用该信号量操作的线程或进程将被阻塞,直到信号量的值大于0。
2025-04-06 11:27:59
964
原创 Linux 线程互斥与同步
和 pthread_cond_signal 不同,pthread_cond_signal 只唤醒 一个 等待的线程,而 pthread_cond_broadcast 唤醒 所有等待的线程。:当线程调用 pthread_cond_wait() 时,它会自动释放所持有的互斥锁,并将自己置于等待状态,直到被另一个线程用 pthread_cond_signal() 或 pthread_cond_broadcast() 唤醒。:条件变量的作用是协调线程的执行,确保某些条件为真时,线程才会继续执行。
2025-04-01 16:49:41
1265
原创 Linux多线程概念与控制
默认情况下,新创建的线程是可连接(joinable)的,即它的资源不会自动释放,必须调用 pthread_join() 才能回收资源。pthread_join() 是一个用于等待线程终止的函数,它确保主线程或其他线程能够等待某个线程结束,并且可以获取该线程的退出状态(即 pthread_exit() 中传递的 retval 值)线程ID: 在 Linux 中,每个线程都有一个唯一的 ID,通常由 内核线程 ID(TID) 和 POSIX 线程 ID(pthread_t) 组成。
2025-03-31 21:08:26
794
原创 Linux 进程信号
进程切换是操作系统调度不同进程的机制,涉及从一个进程的用户态切换到另一个进程的用户态,或者在进行上下文切换时,从用户态切换到内核态。每一个进程都有自己的地址空间,内核空间被映射到每一个进程中,进程要访问自己的系统调用,只需在自己的内存上跳转。信号是由内核发送给进程的一种通知机制,通常当进程处于用户态时,信号会使进程的执行暂停,并转到内核态来处理信号(例如,调用信号处理函数)。在进程从用户态切换到内核态时,操作系统会保存当前进程的上下文数据(包括寄存器的值、程序计数器等),并加载内核态的上下文。
2025-03-29 20:47:11
1285
原创 Linux 进程间通信
它的作用是将通过 shmget 获取到的共享内存段标识符对应的共享内存区域映射到当前进程的虚拟地址空间,从而使得进程能够直接访问共享内存。调用 shmdt后,共享内存就不再对该进程可见,解除映射。命名管道(FIFO,First In First Out)是进程间通信(IPC)的一种方式,提供了比匿名管道更灵活的通信方式,适用于不相关的进程间的数据交换。:某些情况下,一个进程可能需要完全掌控另一个进程的执行流程,例如调试(Debug)进程需要拦截被调试进程的系统调用和异常,同时能够实时获取其状态变化。
2025-03-28 08:23:02
989
原创 Linux 基础I/O
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(通过将数组初始化为零值,你可以确保在没有读取到数据的情况下,数组中不会包含垃圾数据,且如果读取到的字符串没有完全填满缓冲区,数组中未被填充的部分会自动是。读取数据时,读取的内容比数组的大小小,那么未被填充的部分将保留垃圾数据,这可能会导致意外的结果,尤其是在处理字符串时。
2025-03-26 19:15:13
1158
1
原创 Linux进程控制
status: 退出状态码。使用 fork() 和 execvp() 替换子进程中的程序——创建一个父进程,它会创建一个子进程,子进程通过 execvp() 调用来执行 ls 命令,列出当前目录下的文件。std::cout << "子进程PID:" << getpid() << " 其父进程PID:" << getppid() << std::endl;std::cout << "父进程PID:" << getpid() << " 其父进程PID:" << getppid() << std::endl;
2025-03-23 17:15:18
831
原创 Linux进程概念
在 Linux 系统中,当父进程终止时,操作系统会将所有的孤儿进程的父进程 ID(PPID)重新指向 init 进程(PID 为 1)。间接影响:虽然孤儿进程通常不会直接对系统产生危害,但如果父进程设计不当或者进程管理不规范,可能导致不必要的进程创建和管理复杂度,给系统的进程调度带来负担。:每个进程在运行时都拥有独立的资源,如内存地址空间、文件描述符等,确保了进程之间相互独立,互不干扰,即使多个进程同时运行,它们的执行不会直接影响彼此。孤儿进程的管理:孤儿进程在父进程终止时自动由 init 进程收养。
2025-03-23 11:39:57
942
1
原创 Linux开发工具使用
例如,申请内存时,可能会在内存块的前后添加特定的字节模式,以检测越界访问等错误。在编译阶段,编译器将预处理后的代码转换为汇编代码。:编译器在生成可执行文件时包含详细的调试信息,如符号表和源代码映射,方便开发者使用调试工具(如 GDB)进行断点设置、单步执行等操作。:编译器在 Release 模式下会进行各种优化,如内联函数、循环展开、删除未使用的代码等,以提高程序的运行效率和响应速度。:Release 模式下,编译器不会添加额外的调试信息,内存分配更为紧凑高效,但这也意味着缺乏对内存越界等问题的检测。
2025-03-21 21:19:20
1097
1
原创 Linux环境搭建与基本指令
在 Linux 服务器上,多个用户可能属于同一个组,如果一个文件的组权限(Group Permissions)允许读取或写入,该组中的所有用户都可以相应地访问或修改该文件在上文输出中,developers为文件所在组,alice为文件拥有者。作用:tail 命令用于显示文件的最后 N 行内容,默认情况下,tail 会显示文件的最后 10 行。对于目录,写入权限允许用户创建、删除、修改目录中的文件。作用:用于搜索文本内容,可以在文件或标准输入中查找匹配的字符串,并输出匹配的行。
2025-03-21 08:18:36
803
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅