自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 I/O多路复用:poll与epoll

epoll在高并发场景下性能显著优于select和poll,通过结合非阻塞 I/O 和 ET 模式,可大幅减少内核与用户态之间的交互次数,提升高并发场景下的性能。

2025-05-19 17:08:37 625

原创 深入剖析 I/O 复用之 select 机制

由于 `select` 存在一些局限性,它适用于文件描述符数量较少、对性能要求不是特别高的场景,例如一些简单的网络服务器、嵌入式系统等。在实际应用中,若需要处理大量文件描述符或对性能有更高要求,可以考虑使用 `poll` 或 `epoll` 等更高级的 I/O 复用机制。 通过深入理解 `select` 的原理、使用方法和优缺点,我们能够在网络编程中更好地运用这一技术,构建高效稳定的网络应用。

2025-05-08 21:15:38 824

原创 深入探讨 UDP 协议与多线程 HTTP 服务器

UDP 协议以其高效简洁适用于特定场景,而多线程 HTTP 服务器通过并发处理与 HTTP 协议特性结合,成为 Web 通信的重要支柱。深入理解这些技术,能更好地应对网络编程挑战,构建强大稳定的网络应用。

2025-05-07 22:46:43 1455

原创 深入解析 TCP 连接状态:TCP状态转移与 TIME_WAIT 之谜

TCP 连接状态是网络通信的基石,从 `netstat` 命令的直观查看,到状态转移图的理论支撑,再到 `TIME_WAIT` 状态的深入剖析,每一个环节都影响着网络应用的稳定性与可靠性。理解这些状态,能更好地排查网络问题,优化网络编程与系统管理。

2025-05-07 08:30:00 1669

原创 多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析

网络编程的核心是“处理不确定性”——不确定的网络延迟、不确定的数据包顺序、不确定的连接状态。通过合理的协议设计和并发模型选择,才能构建健壮的网络服务。

2025-05-06 22:28:14 812

原创 网络编程核心技术解析:从Socket基础到实战开发

网络编程是构建分布式系统的基石,理解字节序、套接字地址结构和核心系统调用是掌握Socket编程的关键。通过服务器-客户端实战代码,可直观感受TCP连接的建立与数据交互过程,而`netstat`等工具则是排查网络问题的必备手段。在实际开发中,需注意错误处理、字节序转换和性能优化,确保程序的健壮性和高效性。

2025-05-06 22:15:38 737

原创 TCP/IP协议深度解析:从分层架构到TCP核心机制

TCP/IP协议族是互联网的基石,TCP作为可靠传输的核心,通过分层协作、精密的序号确认机制和连接管理,在不可靠的网络层上构建了可靠的端到端通信。理解其分层架构、地址分类、封装流程及TCP核心机制(滑动窗口、三次握手、四次挥手),是掌握网络编程与故障排查的关键。在实际应用中,结合tcpdump等工具分析数据包,能更深入理解协议行为,解决连接异常、性能瓶颈等问题。

2025-05-05 21:36:56 1358

原创 线程与进程深度解析:从fork行为到生产者-消费者模型

多线程与fork的交互需要关注锁状态的继承问题,通过`pthread_atfork`确保同步对象的正确初始化。生产者-消费者模型则是同步机制的经典应用,通过信号量与互斥锁的配合,实现高效的并发数据处理。理解这些机制的底层逻辑和适用场景,是解决多线程编程中复杂问题的关键。

2025-05-05 00:01:48 859

原创 Linux线程同步机制深度解析:信号量、互斥锁、条件变量与读写锁

在多线程编程中,多个线程共享进程资源(如全局变量、文件描述符)时,若对共享资源的访问不加控制,会导致数据不一致或竞态条件。线程同步机制通过协调线程执行顺序,确保共享资源在任意时刻被正确访问。

2025-05-04 23:33:10 787

原创 Linux线程深度解析:从基础到实践

线程是Linux高并发编程的核心工具,理解其与进程的区别、接口使用及同步机制是关键。在实际开发中,需根据场景选择合适的并发模型(多进程/多线程/异步),并注意资源竞争、性能瓶颈等问题。通过合理设置线程属性和使用同步工具,可充分发挥多核CPU性能,实现高效的并行计算。

2025-05-04 23:19:35 764

原创 Linux 进程间通信(IPC)详解

在操作系统里,不同进程间常常需要进行数据交换、同步协调等操作,进程间通信(Inter - Process Communication,IPC)机制应运而生。在Linux系统中,常见的IPC机制有管道、信号量、共享内存、消息队列和套接字。这些机制各自具备独特的特性,适用于不同的应用场景,并且在各类系统和应用程序开发中得到广泛应用,也是技术面试中的重点考查内容。

2025-05-03 23:29:39 1824

原创 linux进程的复制和替换

bash。

2025-05-02 21:12:54 813

原创 Linux 库文件详解

库文件是预先编译好的方法的集合,它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中,主要有两种类型的库文件:静态库和共享库。

2025-05-02 20:33:47 787

原创 Linux 常用命令合集

sudo 命令 参数。mv 原文件 新路径。bg % + 任务号。fg % + 任务号。sleep + 时间。

2025-05-02 20:19:47 860

原创 《C++模板栈实现详解》

避免浅拷贝问题(多对象共享内存导致重复释放)。避免内存分配失败时抛出异常。返回引用允许直接修改栈顶元素。容量,用户可自定义初始容量。栈满时触发扩容,失败返回。内存,重置指针和状态。指针(不删除数据)。(会产生临时对象)。

2025-03-02 11:51:17 263

原创 《C++深拷贝与浅拷贝:内存安全的拷贝构造函数实践》

若自定义拷贝构造函数、拷贝赋值运算符或析构函数中的一个,必须显式实现三者。避免手动管理内存,直接利用标准库的深拷贝能力。:析构时多个对象尝试释放同一内存,导致崩溃。:直接复制指针值,新旧对象共享同一块内存。:通过任意对象修改内容,影响所有共享对象。:一个对象释放内存后,其他对象指针失效。:每个对象持有独立内存块。:明确处理空指针输入场景。提升大内存块复制效率。检查防止未定义行为。

2025-03-02 11:17:16 345

原创 《C++运算符重载深度解析:从加法、流操作到仿函数与类型转换》

public:~Int()Int& operator=(const Int& it) //用const引用右值if (this == &it) //防止自己给自己赋值。

2025-03-02 11:10:51 811

原创 C/C++字符串格式化全解析:从printf到std::format的安全演进与实战指南

用。

2025-02-17 23:29:35 1443

原创 C++构造函数详解:从基础到类型转换机制

函数名必须与类名一致无返回类型声明(包括void)对象创建时自动调用且仅调用一次支持重载与类外定义默认构造函数规则:未声明时编译器自动生成声明任意构造函数后需手动定义无参构造参数带默认值的构造函数视为默认构造优先使用成员初始化列表关键构造函数声明为explicit注意多参数构造的隐式转换规则统一初始化语法{}更安全监控隐式转换的性能影响通过深入理解构造函数的双重角色(对象创建器+类型转换器),开发者可以写出更安全高效的C++代码,在灵活性和严谨性之间取得最佳平衡。

2025-02-17 00:24:58 1023

原创 C++拷贝构造函数初级解析:设计要点、调用机制与性能优化实践

本文深入探讨C++拷贝构造函数的核心设计原理与调用机制。首先通过形参类型分析,指出必须使用const引用以避免无限递归和常对象兼容性问题。其次,结合代码示例解析拷贝构造函数在**函数传参(值传递)和返回值(生成将亡值)**场景下的调用次数,揭示其底层实现逻辑。最后,提出优化策略:形参采用引用传递减少拷贝开销,直接构造不具名对象利用返回值优化(RVO)消除冗余临时对象。文章通过理论分析与实践案例,为开发者提供高效管理对象拷贝的解决方案,助力提升C++程序性能。

2025-02-16 20:40:14 561

原创 深入解析C++静态关键字:生命周期、存储管理与C++11线程安全实现

本文系统解析C++中静态关键字(static)的核心机制与实际应用。从生命周期调整与存储位置入手,通过代码示例剖析静态局部变量的初始化特性(如仅构造一次、值持久化),揭示编译器通过数据区标记位实现单次初始化的底层逻辑。重点探讨C++11标准对静态局部变量线程安全性的增强:基于双重检查锁定(Double-Checked Locking)的初始化保护机制,并对比C++11前的潜在风险。文章进一步指出,线程安全仅覆盖初始化阶段,后续并发读写仍需同步,结合互斥锁与原子操作提出解决方案。最后总结静态关键字的最佳实践。

2025-02-16 02:28:27 1234

原创 函数调用过程的详细解析

按照调用约定(如cdecl),参数从右向左依次压入栈中,esp(栈顶指针)随之下移。call 指令执行时,将下一条指令的地址(返回地址)压入栈中,并将控制权交给被调函数(修改 eip 为函数入口地址)。进入被调函数后,先保存调用者的 ebp(基址指针):push ebp。随后将当前 esp 赋值给 ebp,建立新栈帧:mov ebp, esp。调整 esp 为局部变量预留空间(如 sub esp, 20),可能用特定值(如 0xCC)填充以辅助调试。

2025-02-15 21:00:59 1119

原创 #define宏与编译时定义的本质对决:从const常量到typedef的类型安全演进

本文深入探讨了C/C++中三种定义机制——#define宏、const常量和typedef类型别名的本质差异及其适用场景。首先,通过对比#define的预处理文本替换与const的编译时类型安全,揭示了宏定义在类型检查、作用域控制和调试信息方面的局限性,同时强调了const在代码健壮性上的优势。其次,分析了typedef与#define在类型别名定义中的差异,重点阐述了typedef的编译时类型检查、作用域规则以及对复杂类型(如函数指针和模板)的支持能力,同时指出了宏定义在类型安全和可维护性上的潜在风险。

2025-02-14 22:36:22 890

原创 C++ 完美转发:泛型编程中的参数无损传递

是 C++11 引入的特性,与完美转发(Perfect Forwarding)相关,用于在泛型编程中保留参数的原始类型(左值/右值、常量性等)。它的核心目标是避免不必要的拷贝或类型丢失,同时支持移动语义和泛型代码的高效性。,结合模板类型推导和引用折叠规则,可以将参数“原样”传递给其他函数。避免不必要的拷贝,同时正确处理左值/右值。:若直接传递参数,右值可能退化为左值,导致无法触发移动语义。:若参数是临时对象(右值),未正确传递会导致拷贝而非移动。的类型,将参数转换为原始的左值或右值引用。

2025-02-14 19:04:18 527

原创 C++ decltype 与 C 语言 typeof 的对比与应用:编译时类型推导的实践与思考

decltype在编译时推导类型,不会执行表达式。如果表达式是左值,decltype推导出引用类型。如果表达式是右值,decltype推导出值类型。这个特性使得decltype在模板编程和泛型编程中非常有用,尤其是在需要根据表达式类型推导出变量类型时。通过typeof_a > _b?_a : _b;})// 输出 10// 输出 3.14return 0;

2025-02-13 23:51:58 1102

原创 程序的内存管理与C/C++动态内存分配详解

在使用malloc进行内存申请时,不仅申请40个字节(用cd填充),并且在四十个字节头和尾部,有一片空间是为了防止内存越界(用fd填充),再往上有一片空间(头部信息),这片空间大约28个字节,存储申请空间地址的双链表,在这28字节下边存储着此次malloc所需要使用的字节数(40)。删除并不是删除变量本身,而是将变量指向的的空间还给堆区,从引用状态变为未引用,在删除后变量里存的还是这片空间的地址,此时的指针称为失效指针(失能指针),所以要在delete后将指针置为空。new申请空间失败:返回异常。

2024-11-04 22:21:24 953

原创 命名空间、域、同名隐藏

同名隐藏,在C++中,是指当一个类(或作用域)中存在与父类(或外部作用域)中同名的成员或变量时,内部的同名成员或变量会隐藏外部同名的成员或变量。如果存在两个或多个具有包含关系的作用域,外层作用域声明了一个标识符,而内层作用域也声明了同名标识符,那么外层作用域的标识符在内层作用域中将不可见,即被内层作用域的标识符所隐藏。如果派生类声明了一个和基类成员同名的新成员(无论是函数还是变量),那么基类中的同名成员在派生类的作用域内将被隐藏。这些标识符在函数内部是可见的,但在函数外部是不可见的。

2024-11-04 22:14:28 409

原创 c++ 函数模版

为了代码重用,代码就必须是通用的;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化程序设计。

2024-11-02 19:59:11 810

原创 C++ 函数重载:概念、规则、调用约定与名字修饰

在c语言中,实现int, double,char 类型的比较大小函数。a : b;a : b;a : b;这些函数都执行了相同的一般性动作;都返回两个形参中的最大值;从用户的角度来看, 只有一种操作 ,就是判断最大值, 至于怎样完成其细节,函数的用户一点也不关心。: 在同一个域中出现的名字必须指向一个唯实体(函数体)。这种复杂性给程序员带来了一个实际问题 ,他们必须记住或查找每一个函数名字。函数重载把程序员从这种词汇复杂性中解放出来。

2024-11-02 18:41:02 992

原创 内联函数与宏函数的对比及内联函数的使用

内联函数是C++中用于优化函数调用开销的一种机制。与宏函数相比,内联函数具有类型安全检查、可调试、易于编写和维护等优点。然而,内联函数的使用也需要注意一些问题,如函数体的大小、递归函数的处理以及声明和定义的放置等。正确使用内联函数可以提升程序的运行效率,但也需要根据具体情况进行权衡和优化。

2024-11-02 01:09:54 355

原创 C++中指针、引用与const的深入解析

然而,对于引用类型的数组,每个元素都需要一个已存在的对象来引用,这在数组声明时通常是不可能的,因为编译器不知道要引用哪些具体的对象。②定义s2是一个指向常量的指针的引用,仍然是p的别名,但是这个别名指向的位置是常性的,这意味着通过 s2,不能修改。①定义s1是p指针的引用,即s1是p的别名,如果修改s1自身,就会试图修改p的值,所以不能编译通过;④s4是一个常性的指向常量的指针的引用,既不能修改 s4 指向的地址,也不能修改 s4指向的值。//s是p的指针,保存p的地址。//通过解引用修改的是a的值。

2024-10-23 23:25:48 996

原创 C++中的值类别与引用

特别是当右值引用引用的是一个即将被销毁的对象时,通过右值引用进行修改可能会导致程序崩溃或其他不可预测的行为。表示的引用,从C++11开始引入,用于引用右值。但需要注意的是,右值引用的对象可能是即将被销毁的(特别是当右值是一个临时对象时),因此通过右值引用进行修改可能是未定义行为。需要注意的是,现代C++中“亡值”这个术语的使用已经不太常见,更多时候我们使用“右值”来指代这类值。需要注意的是,右值并不一定意味着“即将消亡的值”,但在早期C++中,这个术语经常与临时对象的生命周期联系在一起。

2024-10-23 23:16:56 282

原创 C++中引用的特性及其优势:以Swap函数为例

深入探讨C++中引用的特性及其在实际编程中的优势。通过详细分析引用的定义、特点以及与指针的区别,本文将进一步阐述引用在提升代码安全性、简洁性和可读性方面的作用。此外,文章还将以Swap函数为例,展示引用在函数参数传递中的具体应用和效果。

2024-10-10 23:26:39 229

原创 指针和const之间的关系

代码分析:在此代码中,a为常性,即a自身的值不能被改变,p1保存a的地址,因为a是常性,所以在定义指针时,应该不能通过指针修改a的值,所以应该在*的左边加上const,表示该指针不能修改指向,因此上述代码只有p2和p4能够编译通过。代码分析:在此代码中,p的指向被修饰为常性,意味着不能通过指针修改a的值,因此,如果再定义一个指针保存p的地址时,新指针不能通过解引用进行修改,即在传递的过程中不允许能力扩张,上述代码中s2和s4可以被编译通过。//error,const修饰了指针的指向,不能通过指针修改。

2024-10-10 22:50:40 823

原创 对常变量来说c和c++的编译政策不一样

在我们整个程序运行阶段,要经过预编译、编译、汇编、链接这几个过程,实际上c++编译器在预编译过程中,将所有的常变量已经替换成常量表示,在这个程序中就是把a用10代替,这就是为什么会有上边的运行结果,同时也是为什么用常变量做数组后缀可以通过的原因。在代码中,我们用了耍流氓的方式将a这个常变量的值改为了100,之后将a的值赋给b,按正常情况来说,a和b的值打印出来应该是100,那为什么只有*ip的值是100呢?当我们的程序用c编译器编译时下面的代码是不能通过的,即在c语言中学习的变量名不能在数组后缀中使用。

2024-10-10 21:19:20 513

原创 #if #ifdef #else #endif用法解释

例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。它的作用是:当标识符已经被定义过(一般是用**#define**命令定义),则对程序段1进行编译,否则编译程序段2。如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。如果在Windows上编译程序,则可以在程序的开始加上。这种条件编译可以提高C源程序的通用性。#ifdef 标识符。#ifdef 标识符。

2024-10-09 23:39:40 307

原创 如何判断一段程序是由 C 编译程序还是由 cpp 编译程序编译的?

2、有时候我们可能需要在程序运行时(而非编译时)判断当前代码是由C编译器还是C++编译器编译的。编译器在编译过程中会定义一些特殊的宏,这些宏可以在源代码中被用来进行条件编译或运行时检查。而C++则使用C++编译器,该编译器不仅支持C语言的全部功能,还扩展了诸如类、继承、多态、模板等面向对象编程的特性。编译器在编译过程中,会根据源文件的扩展名来智能地选择使用哪种编译器进行编译。在编译时,C和C++的编译器存在显著差异,这是因为它们遵循不同的语言标准和规范。#else // 这段代码是在C编译器下编译的。

2024-10-09 23:32:45 693

原创 C++ 字符串与字符数组

字符数组必须以空字符('\0')终止,否则可能会导致未定义行为。在C++中,当字符数组的初始化列表中的字符数量少于数组大小时,剩余的位置会被自动填充为空字符。cout和printf在打印字符串时,会在遇到'\0'时停止。函数可以用于从标准输入读取一行字符串,直到达到指定的长度或者遇到指定的结束符。

2024-10-08 20:59:38 440

原创 c和c++不同的输入输出方式

/endl相当于\n,有缓冲区,当碰到endl时就把缓冲区的东西打到屏幕上。//没有缓冲区,直接打到屏幕上。stderr 不能将输出重定向,只能输出到控制台中。}//用Linux ./main > 1.txt。stdout 可以将输出重定向到某个文件上;{ //数据类型的变化不会改变代码语句。

2024-10-08 20:59:04 223

原创 ()初始化与{}初始化方式的不同

C++11引入了统一的初始化方案,使用花括号进行初始化,适用于各种类型的变量。//不会进行类型转化,要求严格。int sum();//可能是一个函数的声明。int num{};//用0对变量做初始化。

2024-10-08 20:35:31 363

空空如也

空空如也

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

TA关注的人

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