avatar
文章
17
标签
0
分类
4
首页
时间轴
标签
分类
清单
  • 音乐
  • 照片
  • 电影
友链
关于
Aixheee`Blog
搜索
首页
时间轴
标签
分类
清单
  • 音乐
  • 照片
  • 电影
友链
关于

Aixheee`Blog

【内存分配与管理】移动语义
发表于2026-05-26|更新于2026-05-26|内存分配与管理
在探讨了RAII和智能指针之后,我们看到C++如何通过所有权模型来管理堆上资源的生命周期。unique_ptr的“独占所有权”和shared_ptr的“共享所有权”,将资源管理的责任从模糊的约定提升为编译器可检查的类型系统特性。 然而,所有权思想的价值远不止于智能指针。当我们审视值语义对象时,一个自然的优化思路浮现了:如果某些对象只是临时存在的“中间产物”,我们能否不进行昂贵的深拷贝,而是“移动”其内部资源的所有权? 这就是C++11引入移动语义的核心动机。移动语义实际上是所有权思想在值语义领域的自然延伸: unique_ptr的移动是“堆资源所有权的转移” 普通对象的移动是“对象内部资源所有权的转移” 通过移动语义,C++实现了一个精妙的平衡:既保持了值语义的简洁性和确定性,又在需要时避免了不必要的拷贝开销。配合RVO/NRVO等编译器优化,现代C++让值语义对象既安全又高效。 本文将探讨移动语义的完整技术栈:从左值/右值的本质区分,到右值引用如何支持移动语义,再到完美转发如何解决通用代码中的值类别保持问题。 左值、纯右值与将亡值这些值类别是表达...
【内存分配与管理】RAII与智能指针
发表于2026-05-23|更新于2026-05-23|内存分配与管理
在上一篇文章中,我们探讨了C++为何选择值语义作为其核心设计哲学,以及这种选择如何深刻影响了C++的内存模型。我们看到了值语义带来的高效性,但也意识到并非所有对象都能简单地“被复制”——线程、文件、网络连接等资源天然具有唯一性,必须通过引用语义来管理。 这引出了一个更深层的问题:当C++程序员不得不使用引用语义(堆上对象)时,如何避免值语义所不具备的那些内存管理复杂性——内存泄漏、悬空指针、双重释放? 答案就在C++另一项核心思想中:RAII(Resource Acquisition Is Initialization)。 本文将探讨RAII如何将资源生命周期绑定到对象生命周期,以及智能指针如何通过明确的所有权模型,让堆上资源也能享受到类栈的自动管理。 RAII思想为什么需要RAII? 在没有RAII的情况下,有以下问题: 资源所有权不清晰,很容易出现资源泄露或double free的问题,比如类中有裸指针成员 资源释放路径不唯一,函数退出的方式太多,比如return、分支内提前return、抛异常等等,在代码复杂的情况下,无法完全保证每条路径都正确地释放资源,可能没释放,也...
【内存分配与管理】从值语义出发,理解C++内存管理设计逻辑
发表于2026-05-20|更新于2026-05-20|内存分配与管理
在具体展开C++内存管理之前,本篇文章将从值语义这一C++设计基石出发,理解C++内存管理的根因缘由。你将明白为什么C++选择这条看似复杂但极致高效的道路,以及这种选择如何深刻影响着从对象生命周期到智能指针设计的每一个角落。 值语义与C++值语义是指对象的复制会创建一个独立的副本,每个副本都有自己的数据,修改一个副本不会影响其他副本。简单来说,值语义对象就像是数学中的数值,彼此独立,互不干扰。相对的,引用语义指的是对象不直接存储数据,而是持有对数据的引用(指针、引用等),多个对象可以共享相同的数据,修改其中一个会影响其他所有共享该数据的对象。 C++的设计初衷是让用户定义的类型(class)可以像内置类型一样工作,具有同等的地位,让class本质上是值语义 Bjarne Stroustrup在《C++语言的设计与演化》中多次强调这一点: “在C++中,用户定义类型应与内置类型具有相同的支持、相同的语法使用方式和相同的效率。” “让用户定义的类型与内置类型一样工作良好的目标,是C++抽象机制设计的中心思想。” “C++的类机制允许程序员定义与内置类型在使用方式、行为复杂性和效率方...
【内存分配与管理】理解new与placement new
发表于2026-05-19|更新于2026-05-19|内存分配与管理
前三篇文章中,我们已经了解了malloc的底层实现以及与我们平时接触最为密切的的堆栈内存分配,本篇文章将从malloc的底层机制到new的面向对象封装,了解new的设计理念、底层实现以及正确用法 new表达式我们先来从最表层来对比一下malloc与new:1.概念上的区别         malloc/free是C/C++标准库函数,而new/delete是C++关键字,或者说是new表达式。因此malloc仅仅只分配内存,而不会进行初始化类成员的工作,new不止分配内存,而且还调用类的构造函数。 2.返回类型的不同         new内存分配成功时候,返回的是对象类型的指针,不需要进行类型转换,从这个角度来说比较安全malloc内存分配成功则返回 void类型(泛型指针),必须通过强制类型转换将 void* 转换成需要的类型。 3.分配失败后的返回值不同         malloc失败,会返回空指针。new失败,默认是抛出异常,要捕获异常bad_alloc 4.是否需要指定内存大小         new操作符申请内存的时候不需要指定内存块的...
【内存分配与管理】关于堆、栈的思考
发表于2026-05-14|更新于2026-05-14|内存分配与管理
在上一篇文章中,我们深入探索了malloc的底层实现,看到了通用内存分配器如何在碎片与效率之间寻找平衡。然而,malloc仅仅管理着内存世界的一半版图——堆。理解内存分配的全貌,我们还需要认识另一个同样重要但哲学截然不同的领域:栈。 本文我们将跳出具体的分配器实现,从更高维度思考:为什么程序需要同时存在堆和栈这两种内存模型?它们的本质区别是什么?又是什么深层的设计哲学决定了它们各自的特性和限制? 总结概括【基本管理规则】 栈是内存连续的,栈上的内存由系统自动管理,其空间较小,栈上对象的生命周期严格受到作用域的限制。【优点】 优点在于栈内存的分配和释放基于移动栈指针实现,速度较快不需要担心内存泄露;并且由于永远遵循先进后出的规则回收,所以内存永远是连续的,不会产生内存碎片。【缺点】 但是,为了保证栈的高效,栈布局必须在编译期确定,因此栈对象的灵活性较差,不允许动态分配。 【示例】 比如函数调用的返回地址、函数参数、局部变量等都会存储在栈上,在函数调用时移动栈指针开辟函数栈帧,函数结束时通过移动栈指针来释放内存。 【基本管理规则】 堆是无序内存,需要由用户手动管理或是通过GC来管理,...
【内存分配与管理】malloc设计哲学
发表于2026-05-12|更新于2026-05-12|内存分配与管理
上篇文章中主要讲解了malloc底层的原理机制,本篇文章则侧重于讲解为什么malloc要这样设计 allocator要解决的核心矛盾在哪?allocator需要在有限的时间开销下,尽可能高效地利用虚拟地址空间,其必须在 分配/释放的时间复杂度 与 堆空间的碎片率(空间利用率) 之间做权衡 追求速度意味着: 为了快,allocator通常会使用固定内存大小块、此时可以做到O(1)分配,减少了遍历、合并和切割操作,更倾向于粗粒度管理内存块,比如fastbin和smallbin。但这样做的结果就是,由于不能切割,用户可能拿到“偏大的块”,导致内部碎片;同时由于不能频繁合并,在短时间内会导致外部碎片。速度增加—>碎片增多—->空间利用率下降 追求空间利用率意味着: 为了提高空间利用率,allocator必须做精细切割、频繁合并,通过遍历做best-fit并维护更复杂的数据结构(红黑树/ordered bins)。这样做的结果就是,malloc/free成本增大,多线程下锁竞争更严重。空间利用率升高—>时间开销增大 所以,ptmalloc的分...
【内存分配与管理】malloc原理剖析
发表于2026-05-10|更新于2026-05-10|内存分配与管理
前言当我们谈论程序性能时,总绕不开“内存”这个话题。内存管理如同程序的血脉系统,决定着程序的效率、稳定性和资源利用率。我们对内存的理解不能只停留在malloc/free、new/delete的简单调用层面,更要对其背后的机制以及设计缘由有所理解。 这是“内存分配与管理”系列的第一篇文章。我们将从最基础、也最重要的malloc开始,逐层揭开内存管理的神秘面纱。malloc不仅仅是C语言中的一个库函数,更是理解现代操作系统内存分配思想的窗口——它的设计哲学、实现策略、以及效率与通用性的权衡,构成了整个内存生态的基础。 在具体说malloc之前,我们先分清楚几个常见的概念:allocator、malloc和ptmalloc:malloc理解为分配内存的接口,allocator是一个负责内存分配和回收的具体策略实现。在Linux + glibc默认环境下,通过ptmalloc策略来实现(ptmalloc是一个名称);Google实现了tcmalloc策略,微软实现了mimalloc…. arenaptmalloc针对堆管理,最顶层的管理结构为malloc_state,...
12
avatar
Aixheee
明道若昧,进道若退,夷道若纇
文章
17
标签
0
分类
4
最新文章
网络同步技术方案——帧同步与状态同步2026-06-15
从源码到机器码:C#编译与运行时底层原理2026-06-10
Fantasy中的async/await+FTask机制2026-06-08
分类
  • C#4
  • 内存分配与管理11
  • 操作系统1
  • 网络同步1
归档
  • 六月 2026 10
  • 五月 2026 7
© 2026 By Aixheee
搜索
数据加载中