自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Lua 面向对象编程完全指南:从元表到私密性,解锁灵活封装技巧

Lua虽无原生OOP支持,但通过table和元表机制可实现封装、继承和多态三大特性。本文详解Lua实现OOP的三种方式:1)基于table的原型继承,通过元表__index实现方法查找;2)多重继承方案,利用__index函数搜索多个父类;3)闭包实现的严格私密性控制,将内部状态存储在局部变量中。关键结论:元表继承会破坏私密性,二者通常需二选一;公有变量需显式放入接口table;折中方案可显式引用共享方法。全文包含完整示例代码,帮助开发者掌握Lua的灵活OOP实现方式。

2025-11-06 10:56:53 1130

原创 深入 Lua 环境机制:全局变量的 “容器” 与 “隔离术”

本文揭示了Lua全局变量的底层机制,指出所有全局变量实际存储在一个名为_G的普通table中。通过环境(Environment)机制,开发者可以动态访问全局变量(_G[varname])、处理嵌套字段(getfield/setfield)、限制未声明全局变量的创建(使用元表控制__newindex和__index)。更高级的功能包括使用setfenv为函数设置独立环境,实现模块封装和沙盒隔离。这些方法打破了"全局变量就是全局"的固有认知,提供了精细控制全局变量的技术手段,特别适用于大型项

2025-11-03 16:45:37 807

原创 深入 Lua 元表与元方法

本文深入解析Lua元表(metatable)的核心概念与应用。元表通过元方法(metamethod)扩展Lua值的行为,使table支持算术运算、自定义比较等高级特性。重点讲解了setmetatable/getmetatable的使用方法、算术和关系类元方法的实现(如__add、__eq)、库定义元方法(__tostring、__metatable)以及table访问元方法(__index和__newindex)的分工协作。通过集合运算、继承实现、只读table等案例,展示了元表如何突破Lua默认行为限制,

2025-11-03 16:01:36 948

原创 Lua--数据文件和持久性

本文介绍了Lua中存储和读取结构化数据的两种实用方法。首先,通过定义Entry函数和dofile加载数据文件,可以将配置、用户信息等数据以Lua代码形式存储,实现高效直观的数据管理。其次,利用串行化技术将Lua变量转换为可执行的Lua代码字符串,方便保存和恢复复杂的table结构。这些方法充分利用了Lua本身的特性,避免了引入额外解析库的复杂性,同时支持灵活的数据格式和高效的处理性能,特别适合中小规模数据的持久化需求。

2025-10-31 10:51:25 688

原创 Lua--协程

Lua协程编程摘要:协程通过coroutine.create创建,初始为挂起状态。coroutine.status可查看协程状态(挂起、运行、死亡、正常)。通过resume启动/yield挂起实现协作式多任务,yield可保存状态并传递参数。resume-yeild机制实现双向数据交换:yield参数成为resume返回值,resume参数成为yield返回值。该机制可解决生产者-消费者模型中的主循环冲突问题,通过协程封装使消费者主导流程,并支持通过过滤器实现中间数据处理。协程执行错误会通过resume返回

2025-10-29 19:31:33 1248

原创 Lua-编译,执行和错误

Lua代码加载机制及错误处理小结:Lua提供dofile、loadfile、loadstring三种方式加载代码,区别在于执行时机和代码来源。dofile直接执行文件,loadfile返回可重复调用的函数,loadstring从字符串加载代码。需注意作用域问题,编译后的代码默认在全局环境执行。错误处理推荐使用assert简化条件判断,error可主动抛出异常。load系列函数底层基于load实现,支持自定义读取器。正确使用这些特性可提高代码健壮性和执行效率。

2025-10-28 15:29:42 740

原创 Lua-迭代器

本文介绍了Lua中迭代器的三种实现方式:1)闭包迭代器通过函数闭包保存遍历状态;2)泛型for循环语法糖自动处理迭代器调用;3)无状态迭代器由循环传递状态参数。重点解析了无状态迭代器的工作原理:迭代器函数接收恒定状态和控制变量,返回下一状态,依赖外部循环维护遍历进度。相比闭包迭代器,无状态版本更轻量、可重用,是Lua内置迭代器(如ipairs)的实现方式。文章通过代码示例对比了不同迭代器的状态管理机制,阐明了泛型for循环与迭代器的协作关系。

2025-10-28 14:30:46 915

原创 Lua-可变参数

Lua中函数可以接受可变数量参数,通过...语法实现。处理可变参数主要有三种方式:转换为table{...}、直接使用...表达式或结合select函数。当参数包含nil时,需注意table方式会被截断,此时应使用select('#',...)获取实际参数数量。select函数有两种模式:基数模式计算参数总数,选择模式提取特定位置参数。固定参数和可变参数可结合使用,如string.format常用模式。ipairs和pairs的遍历规则不同,不确定时建议使用pairs。

2025-10-28 08:00:00 216

原创 Lua-类型与值

Lua是一种动态类型语言,包含8种基础数据类型:nil(空值)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)和table(表)。其中nil表示无值,boolean包含true和false,但Lua中除false和nil外其他值都视为真。number表示实数,string是不可变字符序列,table是灵活的数据结构,function支持高阶函数编程。Lua的类型系统灵活,支持动态类型转换和自动内存管理,适用

2025-10-27 14:51:28 896

原创 Lua-function的常见表现形式

本文深入解析了Lua5.1中函数的多种形式与应用场景,包括基础函数定义(全局/局部函数)、Table中的方法(面向对象编程)、匿名函数(回调机制)以及闭包(状态保持)。文章通过具体代码示例展示了各种函数的使用方法,如玩家升级系统、数组处理、计数器实现等,并介绍了错误处理和函数缓存优化等实用技巧。这些内容全面覆盖了Lua函数编程的核心概念,为开发者提供了丰富的实践参考。

2025-10-27 11:05:58 357

原创 C++面试(3)

本文摘要总结了C++ STL容器相关的重要知识点,包括迭代器失效原因、vector扩容机制、deque实现原理、set/map底层实现(红黑树)、unordered_map哈希表实现、哈希冲突解决方法,以及智能指针与普通指针的区别。重点分析了不同容器的特性:vector连续存储导致扩容地址变化,deque分段连续内存结构,set/map基于红黑树实现自动排序,unordered_map采用哈希表实现快速查找。同时比较了map和unordered_map在有序性、实现原理上的差异,并介绍了智能指针相比普通指针

2025-10-15 08:15:00 1333

原创 C++面试(2)

本文摘要: C++核心概念解析:1)拷贝构造函数用于新对象初始化,赋值操作符用于已有对象赋值;2)虚函数可内联但多态时不行;3)虚函数有实现,纯虚函数无实现且使类抽象化;4)析构函数设为虚函数防止内存泄漏。STL容器详解:1)分类顺序/关联/适配器容器,底层实现决定时间复杂度;2)vector连续存储适合随机访问,list链表适合频繁插入删除;3)vector扩容需重新分配内存。类型转换:static_cast/dynamic_cast/const_cast/reinterpret_cast提供严格类型转换

2025-10-14 08:30:00 599

原创 C++面试(1)

本文摘要: delete和free的区别:delete是操作符,用于释放new分配的空间,会调用析构函数;free是函数,用于释放malloc分配的空间,不会调用析构函数。 面向对象三大特征:封装(数据与操作结合)、继承(代码重用)、多态(运行时动态绑定)。 重载与重写的区别:重载是同一作用域同名函数参数不同;重写是派生类重新定义基类虚函数。 浅拷贝与深拷贝:浅拷贝仅复制指针值,可能导致重复释放;深拷贝会复制指针指向的内容。 虚函数实现原理:通过虚函数表和vptr指针实现动态绑定,支持多态。 纯虚函数:格式

2025-10-13 16:47:13 738

原创 Linux 线程控制:创建、终止与同步机制完全指南

文章摘要:本文深入解析Linux POSIX线程编程技术,分为五个核心部分:1)剖析pthread库架构与实现机制;2)详解线程创建技巧,包括属性定制与命名方法;3)全面讲解线程终止机制与资源清理;4)深入探讨线程同步技术,包括互斥锁优化和条件变量实战;5)提供线程调试与性能分析工具链。文章包含大量代码示例和底层实现细节,如获取真实LWPID、设置自适应锁等高级技巧,并总结了资源管理三原则和错误处理模板等最佳实践,为开发者提供从基础到进阶的多线程编程指南。

2025-08-18 12:00:00 510

原创 Linux线程:并发编程的艺术与陷阱(终极指南)

本文深入解析Linux线程的核心优势与挑战。线程通过clone()系统调用实现资源共享,相比进程创建速度快12.8倍、切换快7倍,内存占用减少9.3倍,如Nginx采用多线程后QPS提升6倍。文章详细探讨了线程同步、死锁预防等关键问题,并给出ThreadSanitizer等调试工具的使用方法。高级部分涵盖线程池优化、原子操作等实战技巧,以及协程、无锁数据结构等现代并发模型。最后提供生产环境黄金法则:线程数=CPU核心数×(1+I/O等待时间/计算时间),并推荐系统学习路径。全文从理论到实践,为构建高性能并发

2025-08-17 12:15:00 817

原创 深入理解 Linux 线程:从概念到虚拟地址空间的全面解析

Linux线程与虚拟地址空间解析 线程是操作系统调度的最小单位,Linux通过轻量级进程(LWP)实现线程,与进程共享资源但拥有独立栈和调度属性。相比进程,线程创建开销小、通信高效,但需同步机制(如互斥锁、信号量)避免竞态条件。虚拟地址空间让线程共享代码、数据段,而分页机制和TLB优化内存访问。多线程适合I/O密集型任务,线程池可减少创建销毁开销,但需平衡同步与性能。深入理解线程机制,能有效提升多核CPU利用率,优化高并发程序性能。

2025-08-16 19:07:26 668

原创 互斥锁与条件变量

本文系统性地介绍了线程互斥与同步的核心概念及其实现方法。主要内容包括:1. 线程互斥基础:通过ATM机场景类比讲解临界资源、临界区和互斥机制,分析售票系统案例中竞态条件产生的原因及互斥量解决方案;2. 互斥量实现原理:阐述原子指令和锁的底层实现机制,并给出C++封装示例;3. 线程同步与条件变量:引入生产者-消费者模型,详细解析条件变量的使用规范及其与互斥锁的配合机制;4. 同步原语实践:提供了阻塞队列和环形队列的完整实现方案,比较了条件变量与信号量的不同应用场景。文章通过生活化类比和代码实例,深入浅出地阐

2025-08-06 22:17:53 764

原创 动态链接与动态库加载——程序世界的构建艺术

本文深入解析程序链接和内存管理的核心机制。静态链接部分揭示目标文件如何通过重定位表"相亲成功",将未识别的函数调用地址在链接时修正。虚拟地址机制展示了编译器与操作系统如何协作,通过ELF文件预先规划逻辑地址,并在进程创建时初始化内存结构。动态链接部分则呈现了共享库的精妙设计:地址无关代码、GOT/PLT协作机制实现延迟绑定,ld-linux作为"图书管理员"协调库共享,通过写时复制和缓存优化性能。这些机制共同构建了现代程序高效运行的基石,如同精心规划的城市系统,在资源

2025-07-13 02:33:33 803

原创 程序编译链接全景解析:从源代码到可执行文件

摘要:ELF文件是Linux系统下编译过程中的关键中间产物,主要包括可重定位文件(.o)、可执行文件、共享目标文件(.so)和内核转储文件。ELF文件由ELF头、程序头表、节头表和节区组成,其中.text节存储代码、.data节保存初始化变量、.bss节为未初始化变量预留空间。在链接过程中,多个.o文件的相同节区会被合并,最终形成可执行文件的段(segment)。操作系统加载程序时,会根据程序头表将不同权限的段映射到内存。理解ELF文件结构有助于解决编译和链接问题,通过readelf、objdump等工具可

2025-07-05 23:38:26 835

原创 程序库:代码复用的“魔法宝箱“——静态库与动态库

【程序库:开发者的魔法工具箱】程序库就像软件开发者的"魔法宝箱",提供可复用的代码工具,避免重复造轮子。静态库(.a/.lib)将代码打包进程序,独立性强但体积大;动态库(.so/.dll)运行时加载,节省空间但依赖环境。制作静态库需编译.o文件后用ar打包,动态库则需-fPIC位置无关码和-shared选项。使用库文件需指定路径(-L)和库名(-l),动态库还需设置LD_LIBRARY_PATH或放置到系统目录。合理运用库能显著提升开发效率,是程序员必备技能。

2025-07-04 14:42:16 2161 1

原创 Linux--迷宫探秘:从路径解析到存储哲学

本文深入解析Linux文件系统的路径管理机制。首先揭示路径解析的递归本质:访问文件需从根目录逐层打开各级目录,形成完整路径。系统通过dentry结构在内存中构建路径缓存树,加速文件访问。其次探讨多分区挂载原理,说明跨分区路径统一性是通过挂载机制实现的。最后对比软硬链接的本质差异:硬链接共享inode,适用于防误删;软链接存储路径字符串,支持跨分区灵活管理。文章还分析了进程如何通过内核结构体维护文件系统视图,并解答了根目录inode编号为2等设计细节。整个文件系统设计体现了"共享与隔离"的

2025-06-21 14:18:56 711 1

原创 Linux--深入EXT2文件系统:数据是如何被组织、存储与访问的?

本文围绕 Linux 的 ext2 系列文件系统展开,先介绍文件系统需格式化硬盘才能存储文件,ext2 是常⻅类型,将分区划分为块组 。接着详述块组内部构成,含超级块、GDT、块位图等组件及功能 。还讲解 inode 和数据块映射、文件增删查改原理,以及目录与文件名的关系,阐明访问文件需通过目录文件映射inode号来实现,展现了 ext2 文件系统高效可靠的管理机制。

2025-06-16 08:00:00 980

原创 Linux--存储系统探秘:从块设备到inode

📝 Linux存储系统核心概念摘要 本文以生动比喻解析Linux存储系统的关键概念: 1️⃣ 块(Block) - 数据存储的基本单位(通常4KB),像乐高积木般组合文件内容,提升读写效率,即使小文件也至少占用一个块。 2️⃣ 分区(Partition) - 物理磁盘的逻辑划分,类比切蛋糕(如Windows的C/D盘),通过柱面编号确定边界,使用fdisk -l可查看分区详情。 3️⃣ inode - 文件的"身份证",存储元数据(大小、权限、时间戳等)而非文件名,每个inode号唯一

2025-06-15 19:35:49 1041 3

原创 Linux--磁盘寻址:从 CHS 到 LBA 的深度解码之旅

本文聚焦 Linux 磁盘的 CHS 与 LBA 地址,先阐释文件系统核心作用及理解 Ext 文件系统的意义。从硬件世界(磁盘、服务器、机柜、机房)的协同,讲解磁盘物理结构,介绍 CHS 寻址的扇区、磁头、磁道、柱面概念,再引出 LBA 线性寻址,说明 CHS 与 LBA 相互转换公式及逻辑,展现磁盘寻址从物理到逻辑抽象的演进,帮助理解 Linux 磁盘数据存储与访问机制 。

2025-06-14 22:42:23 1313 5

原创 Linux--虚拟地址空间(一个故事理解)

本文深入解析了C语言程序中的虚拟地址空间布局及其管理机制。通过代码示例验证了程序运行时内存的五大分区:代码区(存储指令和常量)、数据区(全局/静态变量)、堆(动态分配内存)、栈(局部变量)以及命令行参数区。重点揭示了虚拟地址的本质——进程视角的地址与实际物理地址通过页表映射分离,解释了父子进程相同虚拟地址对应不同物理地址的现象。文章还通过"富豪与子女"的比喻生动说明了虚拟地址空间的工作原理,并详细介绍了Linux内核中mm_struct和vm_area_struct结构体的组织方式。最后

2025-06-13 00:37:00 639

原创 缓冲区(C语言缓冲区+内核缓冲区)一个例子解释他们的关系和作用!!!

本文详细探讨了C语言I/O操作中的缓冲区机制,通过代码示例解释了缓冲区对程序执行顺序的影响。主要内容包括:1. 缓冲区概念:类比菜鸟驿站解释缓冲区作用,包括用户空间缓冲区和内核缓冲区;2. 缓冲区类型:介绍全缓冲、行缓冲和无缓冲三种方式及其应用场景;3. FILE结构体:分析其作为用户空间与内核桥梁的关键字段和作用;4. 缓冲区刷新:通过fork示例说明不同设备(显示器和文件)的缓冲区差异;5. 实践验证:设计简化版libc库验证缓冲区机制。文章揭示了缓冲区如何优化I/O性能,以及理解缓冲区对调试程序的重要

2025-06-11 23:12:47 943

原创 Linux--基础IO(理解文件与用户之间交互的底层原理,小白都能学会)

本文围绕文件操作展开,先探讨printf输出本质,指出Linux下一切皆文件,文件操作本质是进程通过系统调用对硬件的IO操作。接着从狭义和广义角度解释文件概念,说明文件由内容和属性构成,空文件也占磁盘空间。然后介绍C语言文件接口,包括打开、读写文件等操作,以及stdin、stdout、stderr三个默认输入输出流。再阐述位图传递标记法及其优势,引出系统文件I/O接口,对比系统调用和库函数的区别。最后解释文件描述符fd的概念、分配规则和重定向原理,强调Linux“一切皆文件”的理念。

2025-06-10 21:24:59 696

原创 Linux--命令行参数和环境变量

摘要: 本文介绍了Linux命令行参数和环境变量的核心概念。命令行参数分为位置参数(无符号)和选项参数(-短选项/--长选项),并通过C语言示例展示了如何通过argc和argv获取参数。环境变量(如PATH、HOME)是系统级全局变量,用于配置运行环境,可通过echo、export等命令管理。重点解释了环境变量的继承机制:父进程(如bash)的环境变量表会传递给子进程,需用export设置全局变量。此外,程序可通过main的env参数、getenv()函数或全局变量environ获取环境变量。文中还探讨了P

2025-06-08 01:50:22 1261

原创 Linux--进程的调度

1.进程切换1.进程切换CPU上下⽂切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运⾏另外的任务时, 它保存正在运⾏任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的堆栈中, ⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器,并开始下⼀个任务的运⾏, 这⼀过程就是context switch。时间⽚:当代计算机都是分时操作系统,没有进程都有它合适的时间⽚(其实就是⼀个计数器)。

2025-06-07 01:26:47 717

原创 Linux--进程优先级

Linux进程优先级管理摘要:Linux系统中通过优先级(PRI)和nice值(NI)管理进程执行顺序。PRI越小优先级越高,NI作为修正值影响PRI(PRI(new)=80+NI),取值范围-20至19。用户可通过ps -l查看进程信息,使用renice或top命令调整NI值。系统支持多进程的竞争性(资源竞争)、独立性(互不干扰)、并行(多CPU同时运行)和并发(单CPU分时切换)特性。合理设置进程优先级和CPU绑定能显著提升系统性能。

2025-06-06 00:58:01 463

原创 Linux--进程的状态

本文摘要:进程状态模型包含创建、就绪、运行、阻塞、结束等核心状态,其转换受时间片耗尽、I/O等待等条件触发。Linux通过进程控制块(task_struct)管理进程信息,使用运行队列组织就绪进程。当内存不足时,系统会挂起进程或使用swap机制。进程状态包括运行(R)、睡眠(S)、磁盘休眠(D)、停止(T)等,可通过ps命令查看。僵尸进程(Z)是子进程退出后未被父进程回收的状态,会造成内存泄漏;孤儿进程则由init进程自动回收。文章详细阐述了进程状态转换、管理机制及其在Linux中的具体实现。

2025-06-06 00:43:11 1016

原创 Linux--进程的程序替换

问题导入:前面我们知道了,fork之后,子进程会继承父进程的代码和“数据”(写实拷贝)。那么如果我们需要子进程完全去完成一个自己的程序怎么办呢?进程的程序替换来完成这个功能!

2025-06-04 02:12:43 931

原创 Linux--进程概念

本文摘要:进程是程序的执行实例,由内核分配系统资源。Linux系统通过PCB(task_struct结构体)管理进程,包含标识符、状态、优先级、程序计数器等信息。用户可通过/proc系统文件夹或工具(top、ps)查看进程信息。系统调用getpid()和getppid()可获取进程ID及其父进程ID。fork()系统调用用于创建子进程,具有两个返回值:父进程获取子进程PID,子进程获取0,便于区分执行逻辑。fork采用写时拷贝技术,父子进程共享代码但数据独立。

2025-06-02 21:32:26 1337 2

原创 Linux--操作系统(三个例子让你彻底理解操作系统!!!)

三个例子让你彻底理解操作系统!!!

2025-06-02 15:40:44 709

原创 Linux的调试器--gbd/cgbd

摘要:本文介绍了C程序调试的基本方法与技巧。首先说明在Linux下使用gcc/g++编译时需添加-g选项才能调试,对比了debug和release模式的区别。重点讲解了gdb/cgbd调试工具的使用,包括常用命令如list、run、next、step、breakpoint等操作说明,并分析了命令细节。文章还分享了三个调试技巧:1)使用watch监视变量变化;2)通过setvar修改变量值排查问题;3)设置条件断点的方法。最后通过求和程序示例演示了如何使用setvar修改标志位来验证程序逻辑。调试过程中保留调

2025-05-30 23:44:24 1292

原创 Linux 的编辑器--vim

本文介绍了Vim编辑器的基本使用与高级配置。主要内容包括:1)Vim与Vi的区别,Vim是Vi的升级版,支持语法高亮和多平台运行;2)Vim的三种基本模式(命令、插入、底行模式)及其切换方法;3)常用操作命令如光标移动、文本编辑、复制粘贴等;4)末行模式功能如查找替换、保存退出;5)批量注释技巧;6)针对C/C++开发的专业配置方案,包括插件管理、代码补全、调试工具等。通过系统配置,可将Vim打造成高效的编程IDE环境。

2025-05-25 22:42:23 2315

原创 C++ 11 (下)

本文介绍了C++11中的几个重要特性,包括可变参数模板、新的类功能、lambda表达式和包装器(function和bind)。可变参数模板允许定义接受任意数量参数的函数或类模板,通过参数包和包扩展机制实现。C++11新增了默认的移动构造函数和移动赋值运算符,并支持成员变量声明时提供缺省值。lambda表达式提供了一种简洁的匿名函数定义方式,支持捕捉外部变量,并可以用于替代仿函数和函数指针。包装器std::function和std::bind则提供了对可调用对象的统一封装和参数绑定功能,简化了代码的编写和维护

2025-05-20 00:27:40 950

原创 C++ 11 (上)

C++11是C++语言的一次重大更新,旨在解决C++98/03时代的局限性,如性能瓶颈、语法繁琐和并发支持缺失等问题

2025-05-15 23:30:58 1015

原创 C++ 哈希表

哈希概念哈希概念哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。1 直接定址法当关键字的范围⽐较集中时,直接定址法就是⾮常简单⾼效的⽅法,⽐如⼀组关键字都在[0,99]之间,那么我们开⼀个100个数的数组,每个关键字的值直接就是存储位置的下标。

2025-05-10 22:21:56 1150

原创 C++ 红黑树

我们来介绍二叉搜索树家族的另一个成员,也是使用最广泛的成员。

2025-04-29 18:43:35 1446

空空如也

空空如也

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

TA关注的人

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