C++
文章平均质量分 70
STL、多线程等
曾格0
csdn YYDS
展开
-
自动锁重复释放的问题
自动锁的实现,就是在对象析构的时候,销毁线程锁。原创 2023-06-15 23:33:48 · 118 阅读 · 0 评论 -
红黑树的应用与实现
和avl树的选择一样的,首先进行节点的上下互换,然后左旋后,下面的节点在左边;右旋后,下面的节点在右边。这五个性质保证了左右子树的高度不超过2倍,如果一颗子树的高度是n,另一棵子树的最大高度最大是2n-1。旋转是基础,因为在插入和删除后的修复,都需要用到旋转操作,这里只进行插入。原创 2022-12-30 20:48:55 · 141 阅读 · 0 评论 -
多进程共享内存
在内存模型中,内核空间的下面有一块空间叫做内存映射段,包括文件映射、匿名映射、动态链接库映射(程序运行时,将动态库加载到内存,并映射到程序的地址空间)。mmap:一种内存映射文件的方法,将内核中的特定部分内存映射到用户级进程中去,相比普通的read/write少一次拷贝,内核直接把文件数据从磁盘拷贝到共享内存就用户就行访问,使得这份数据不需要同时保留在两个页缓冲中;而write需要先从磁盘拷贝到页缓冲,再从页缓冲拷贝到用户进程;所以你会发现文件利用读写函数下载时,内存变少,buff/cache变大。原创 2022-12-23 17:05:25 · 327 阅读 · 0 评论 -
内存泄漏检测方案
内存泄漏问题原创 2022-12-23 15:37:05 · 354 阅读 · 0 评论 -
查看系统函数实现
以malloc为例,可以很快找到malloc的头文件定义(/usr/include/stdlib.h),但是,无法找到其源文件。这是因为stdlib.h是GCC编译器提供的接口文件,不同的编译器接口标准不同,也就是说编译器只能触及到接口层。而内存由Linux内核分配,malloc属于系统函数,因此,malloc封装在内核层,以防止我们不小心修改了。在/lib64/下,可以发现有个软连接 libc.so.6 (使用软连接是担心用户误删真正的so文件),可以看到,这个动态链接库里,就有malloc的实现。原创 2022-12-17 20:45:47 · 113 阅读 · 0 评论 -
【设计模式三】观察者模式
常用的设计模式之一。原创 2022-09-27 22:09:12 · 233 阅读 · 0 评论 -
C++虚继承详解
C++虚继承详解看侯捷老师的C++内存模型时,讲到了虚继承。虚继承算是C++特有的知识了,特此记录下。什么是虚继承由于C++支持多继承,可能会出现菱形继承,代码如下:#include <iostream> // std::cout std::endlclass base{public: long long par=0; void show(int par) const noexcept;};void base::show(int par) const no原创 2022-04-21 16:17:26 · 4693 阅读 · 0 评论 -
深度探索C++对象模型(二):构造函数语意学
Default Constructor的构造操作C++编译器在以下4种情况默认构造函数被认为是nontrivial的,需要被合成出来。含有类对象数据成员,该类对象类型有默认构造函数。class A{public: A(bool _isTrue=true, int _num = 0){ isTrue = _isTrue; num = _num; }; //默认构造函数 bool isTrue; int num;};class B{public: A原创 2022-05-03 21:11:38 · 801 阅读 · 0 评论 -
深度探索C++对象模型(一):关于对象
世界上第一款c++编译器cfront由Lippman开发的,而本书的作者正是他。现用C++对象模型在c++中,有两种类数据成员:static 和 nonstatic;三种类函数成员:static、nonstatic、virtual。函数都放到代码区,而static成员都放到静态区,因此c++对象的大小由 nonstatic类数据成员、内存填充和virtual指针决定,其中virtual指针来源于:virtual function:用以实现动态多态,支持一个有效率的 "执行期绑定" vi原创 2022-05-02 21:56:39 · 1729 阅读 · 0 评论 -
【设计模式二】策略模式
策略模式策略模式往往用于解决违反开闭原则的代码,为if else提供了另一种选择。假如我们需要计算不同国家的税费,一般是通过枚举来实现:enum TaxBase { // 不同的国家有不同的算法 CN_Tax, US_Tax, DE_Tax, FR_Tax //更改};class SalesOrder{ TaxBase tax;public: // 设计模式大忌,不要用if else 去处理不同的类 // 因为新增或删除一个类,if else就得更改,原创 2022-04-22 09:44:34 · 259 阅读 · 0 评论 -
【设计模式一】、模板方法模式
模板方法假设我们现有这样两段代码:库代码 Library.cpp:// 程序库开发人员class Library{public: void Step1(){ //... } void Step3(){ //... } void Step5(){ //... }};应用程序代码Application.cpp://应用程序开发人员 -- 内部代码class Application{public: bool Step2(){ //.原创 2022-04-22 08:58:55 · 709 阅读 · 0 评论 -
STL源码剖析(五):算法
算法分类:质变算法:在运算过程中会改变迭代器指向的值。质变算法一般提供两个版本,一是就地进行版本,如sort,另一个就是异地进行(copy)版本,如repalce()的另一个版本replace_copy() 非质变算法:如遍历、查找之类STL的一般形式:都需要一对迭代器,标识算法的操作区间,并提取迭代器的5个特性。 可能还需要一个函数对象,指明操作方法,如replace_if()就需要接收functor 最后一个元素称为end,而不用null,这样是因为能对其他容器带来泛型效果所有的数值算原创 2022-04-21 20:56:32 · 97 阅读 · 0 评论 -
STL源码剖析(四):容器(8) hashtable
hashtable原创 2022-04-10 21:23:23 · 1089 阅读 · 0 评论 -
STL源码剖析(四):容器(7)set和map
RB-tree、set、map原创 2022-04-10 19:51:56 · 437 阅读 · 0 评论 -
STL源码剖析(四):容器(6)Rb_tree
之前讲的都是序列式容器,现在开始进入到关联式容器,关联式容器主要以Rb-tree和hash-table做为底层结构。Rb-tree的节点设计RB-tree也是采用继承机制struct _Rb_tree_node_base{ typedef _Rb_tree_Color_type _Color_type; typedef _Rb_tree_node_base* _Base_ptr; _Color_type _M_color; _Base_ptr _M_parent;原创 2022-04-10 16:23:48 · 409 阅读 · 0 评论 -
STL源码剖析(四):容器(5)slist
slist概述slist是一个单向链表,但其实现其实比list要更复杂。slist不在标准规则之内。对于STL习惯来说,插入操作往往是在指定位置前插入,这对slist来说效率太低,因此只提供了insert_after()和erase_after()。由于slist不方便插入和删除,其不提供push_back(),只提供push_front()。节点slist的节点和迭代器的设计,比list复杂很多,运用了继承机制,因此在类型转换上表现地更为复杂。迭代器相关代码:struc.原创 2022-04-08 20:37:39 · 132 阅读 · 0 评论 -
STL源码剖析(四):容器(4)priority_queue
优先级队列原创 2022-04-08 16:14:56 · 593 阅读 · 0 评论 -
STL源码剖析(四):容器(3)deque
111原创 2022-04-08 15:42:01 · 877 阅读 · 0 评论 -
STL源码剖析(四):容器(2)list
111原创 2022-04-08 10:20:57 · 867 阅读 · 0 评论 -
STL源码剖析(四):容器(1)vector
先来一张侯捷书上的图吧容器的衍生并不是通过继承,而是通过组合。比如:stack和queue里包含一个deque,set和map里包含一个rb-tree或hash_table。vectorvector有点类似array,但vector是可以扩展的,但vector在扩展时,需要经历以下三个步骤:配置新空间=》移动数据=》释放旧空间,因此,如果vector空间配置策略不佳,则可能造成较大的空间成本损失。vector定义摘要实现在<stl_vector.h>先看看类型定义吧原创 2022-04-07 17:15:31 · 450 阅读 · 0 评论 -
STL源码剖析(三):迭代器与traits编程技法
为了使迭代器不暴露容器的成员及函数,一般将迭代器的开发工作交由容器的设计者,因此,STL每一种STL容器都提供专属的迭代器。迭代器类型识别C++不支持typeof(),即便动用RTTI性质中的typeid(),获得的也只是类型名称,不能拿来声明变量。解决办法一:利用function template的参数推导机制转调的妙用主要在参数的变化上__uninitialized_copy转调__uninitialized_copy_aux:新增一个参数判断是否含有 non-triaval原创 2022-04-06 15:50:33 · 601 阅读 · 0 评论 -
STL源码剖析(二):空间配置器allocator(3)
STL内存数据填充原创 2022-04-05 21:59:50 · 257 阅读 · 0 评论 -
STL源码剖析(二):空间配置器alloctor(2)
空间的配置和释放:alloc考虑到小型区块可能造成的内存破碎问题,SGI设计了双层级配置器:当配置区块超过128bytes时,便调用第一级配置器;如果小于128bytes,为降低overhead,便采用复杂的memory pool整理方式。为使得alloc符合STL规格,SGI将Alloc做了一层封装:首先看下第一级配置器 class __malloc_alloc_templatetemplate <int __inst>class __malloc_alloc_templ.原创 2022-04-05 17:10:04 · 815 阅读 · 0 评论 -
STL源码剖析(二):空间配置器allocator(1)
STL原创 2022-04-04 23:30:48 · 478 阅读 · 0 评论 -
STL源码剖析(一):STL概论
本系列是结合侯捷老师的 STL源码剖析这本书看的,有理解不到位的地方,敬请提出。版本首先,需了解以下三个C++编译器:GNU:Unix下的编译器 VC++:windows平台下的编译器,微软公司开发,因为windows操作系统都是微软的,所以它是主要的windows平台下编译工具 C++ Builder:英巴卡迪诺公司开发的windows平台编译器,Delphi的姊妹,比较小众。STL的原始版本是HP(惠普)版本,以下三个STL版本都继承了HP版本:GCC采用SGI STL版本。(GC原创 2022-04-04 20:31:47 · 423 阅读 · 0 评论