深入学习c++ c++标准库体系结构与内核分析笔记

2024年C C++最新【操作系统】模块三 :内核_操作系统模块(1),2024年最新面试官6个灵魂拷问 将需要执行的程序,让一个内核线程去执行,内核线程是真正的线程。用户态线程创建成本低,问题明显,不可以利用多核。内核态线程,创建成本高,可以利用 多核,切换速度慢。因此通常我们会在内核中预先创建一些线程,并反复利用这些线程。按照权限管理的原则,多 数应用程序应该运行在最小权限下。其实不是,进程可以通过 API 创建用户态的线程,也可以通过系统调用创建内核态的线程。只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。2、是否强制触发分成可屏蔽中断和不可屏蔽中断。1、 触发方分成同步中断和异步中断; 阅读详情

c++标准库体系结构与内核分析笔记

泛型编程(Generic Programming,GP)

即使用模板为主要工具来编程。

c++标准库SL

由c++编译器提供的各种头文件。

c++标准模板库STL

占据c++标准库的大部分。并含有六大部分。
STL的编写者们规定,他们写的组件都放在 std 这个命名空间中。

STL六大部件

容器 (是一个class template)
分配器(是一个 class template)
算法 (是一个function template)
迭代器 (是一个class template)
适配器 (是一个class template)
仿函数 (是一个class template)

关系图:
在这里插入图片描述
我们先从容器看起,在使用容器时,我们存入取出都涉及到内存的问题,但是这些问题我们并不需要考虑,因为有分配器做容器的内存分配的支撑。
当我们的容器中有数据后,也需要对这些数据进行操作,一些常用的操作本封装成函数,称作算法。
这我们就发现STL在设计思想上就与OOP(面向对象编程)不同,即STL是数据与方法分离,而OOP是将数据与方法封装进同一个类里。
既然数据与方法分离了,那么算法想操作容器,就需要迭代器。

容器——结构与分类

在这里插入图片描述注:若类a想要使用类b的方法,可以让a继承b,或者让a含有一个b(即复合)。

序列式容器(sequence containers)

1、array
我们常用的数组在c++11以后也被定义为一个类,从图中可以看出它两端封死,长度无法改变。
创建时要指定大小:array<int,10>(当大小为0时,默认当作1)
在这里插入图片描述
2、vector
单向自动增长数组。
在这里插入图片描述
vector类中保持三个迭代器:start、finish(元素末)、end_of_storage(容量末)。
所谓自动增长,就是元素数量要超过容量时,vector自动reallocation一定倍数(有的是2倍,有的1.5等等)。
新空间不是接在原内存后面,而是另找一块足够的内存,将原数据拷贝过来,并将原vector释放。

3、deque
双端队列。
在这里插入图片描述
deque支持随机存取,但实际上它的存储是分段的,而不是连续的。如图:
在这里插入图片描述

迭代器有四个成员cur(指向一段空间的数据所在位置)、first(指向数据所在段的首)、last(指向数据所在段的尾,满足前闭后开)、node(指向段地址,这个段地址在专门存储每段地址的空间中)

而queue和stack都是基于deque实现的,只是禁用了deque的一些方法。
所以默认是queue<string,deque<string>>
但是queue和stack也可以基于其他容器实现(只要该容器能提供queue或stack所需的所有方法)
如:stack<string,list<string>>

注:queue和stack都可以基于list,都不可基于map、set,queue不可基于vector,而stack可以。

注:queue和stack不提供iterator,不允许遍历。
4、list
双向链表。
在这里插入图片描述
源码分析:
list中只有一个属性(数据):node(是一个指针list_node*)。
而list_node含有三个属性:prev(指针)、next(指针)、data(T)。
list的迭代器list_iterator重载的操作:
1)*
return (*node).data;
2)->
return &(operator*());
3)++
这是重载前置++
node=(link_type)((*node).next);
4)++(int)
这是重载后置++

STL的实现中,刻意在环状list尾端加一空白的节点,以符合“前闭后开”区间。

5、forward-list
c++11新增的单向链表。
在这里插入图片描述

关联式容器(associative containers)

特点:基于红黑树实现,元素含有key和value,通过key快速查找value。

红黑树(rb_tree)
是一种平衡二分搜索树,平衡即深度大致相同,没有任何一个节点过深。
它的排列规则有利于search和insert。

红黑树提供遍历操作以及迭代器。
按正常规则++it即可遍历,得到排序状态。

但不应通过其迭代器来修改值(红黑树没有禁止,但是基于红黑树的容器禁止了)。

红黑树的insert分为insert_unique()和insert_equal(),即不可添加重复元素和可添加重复元素。
在这里插入图片描述
注:keyofvalue用于从value中取key。

1、set/multiset
set中key和data合二为一。
所有的操作都由set中封装的那个红黑树t来做,所以一定程度上可以把set理解为container adapter。
在这里插入图片描述

2、map/multimap
map既有key也有data,同样含有一个红黑树。
它可以通过迭代器修改data的值。
map重载的[]符号会通过key找data,若key不存在,则查入此key。
在这里插入图片描述

不定序容器(unordered containers)

在这里插入图片描述

这是c++11后新出现的容器(其实也属于关联式容器),可以当哈希表来用:
hashtable
初始化hashtable时要指定桶(buckets)的个数(常为质数),每个桶后面跟着一条链表,用于存放冲突的数据。
当一条链表的长度大于桶的个数时,认为该链表过长(查找效率低下),调用rehashing,扩展桶的数量,并重新安排链表位置。

在这里插入图片描述

分配器

在这里插入图片描述

分配器可以用在定义容器时的模板参数中,控制内存分配的方式,默认使用的分配器是:std::allocator<_Tp>
分配器也可以单独直接使用(而不是配合容器),因为它也是一个类。不过没有必要。
注:单独使用分配器释放内存时,需要写出释放内存的大小,很麻烦。如:

int*p=allocator<int>().allocate(512,(int*)0);
allocator<int>().deallocate(p,512);

VC\GCC等编译器的allocator只是以::operator new和::operator delete完成allocate()和deallocate(),没有任何特殊设计。

/*别看
甚至GCC2.9注释说明,他们在STL中不使用allocator这个分配器,而是使用alloc。(4.9后又默认使用allocator,alloc换名为_pool_alloc)

没有任何特殊设计的allocator在内存分配上最终是调用malloc()。而malloc分配的内存都要在首尾附加的一些信息(overhead),你分配的内存越小,overhead的相对占比就越大,内存使用效率越低。

而alloc采用了16个链表分别存八的倍数的内存,进而使内容不需要每个都带overhead,效率提高。
*/

迭代器

interator在设计时要遵循一定的原则,它必须规定好自己的类别(或属性),以回答traits的“提问”,所谓traits是类似萃取机一般的东西,用于得到对应事物(不只是迭代器)的特征(或类别、或属性)。
例如:

return typename iterator_traits<...>::iterator_category();
//返回迭代器种类。
return typename iterator_traits<...>::value_type();
//返回容器中所放元素种类。
//除此外还有difference_type、reference、pointer一共5种。

这5种属性在迭代器类的实现中都有定义,以便算法的询问(使用)。
在这里插入图片描述
由图中左侧框内内容看出,如果迭代器是一个类的话,算法可以直接访问它的属性,但是当一个迭代器并不是类(比如自然指针)时,就必须依赖于traits了。
在这里插入图片描述
traits使用偏特化(见本文”模板的特化“)来实现对class iterator和non-class iterator的区分:
在这里插入图片描述
关于萃取机:
除iterator traits外,还有
type traits
char traits
allocator traits
pointer traits
array traits

迭代器种类

struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
//单向不能跳,如forward_list
struct bidirectional_iterator_tag:public forward_iterator_tag{};
//双向不能跳,如list、set、map
struct random_access_iterator_tag:public bidirectional_iterator_tag{};
//随机存取,如array、vector、deque...

注:至于unordered容器,它的迭代器类型取决于桶后链表的单双向。

我们可以使用如下方式获得迭代器名字:

#include<typeinfo>
cout<<typeid(itr).name();
//itr是一个迭代器。


注:迭代器间存在继承关系。

算法

容器对于算法是透明的,算法只能通过迭代器获取容器的信息。

算法的模板类似这个样子:

template<typename iterator,typename cmp>
algorithm(iterator it1,iterator it2,cmp cmpfunc){
...
}

由于算法要依赖于迭代器,所以迭代器的类型对算法具有较大影响。
不同的迭代器允许算法有不同的操作,所以算法一般的结构都是在“主函数”中得到迭代器种类,之后跳转到重载的合适函数中执行。(function template没有特化,而是用重载)
又因为迭代器具有继承关系,由于多态性,所以不需要重载每一种迭代器,妙。

注:容器本身自带的算法比标准库提供的算法要快。
在这里插入图片描述

find算法也如上。
在这里插入图片描述

仿函数

常常用到容器或算法的参数中,来规定如何操作,就像从小到大(默认)或从大到小。
举例:
在这里插入图片描述
注意图中的仿函数都有继承的类,而我们自己写的函数或仿函数(重载了“()”)虽然也可以用,但是不继承这些类就不能算融入STL体系中(像算法问迭代器问题一样,适配器要问仿函数一些问题,同样如果得不到回答就会出错)。
这些类是:
unary_function(单操作数)
binary_function(双操作数)
在这里插入图片描述

适配器

起到一种桥梁的作用,如适配器a对b进行一定的修饰来满足被使用的需求,即通过a来使用真正做事的b。
我们知道a想要使用b的功能,编程上有两种做法,即:a继承b、a含有b。
在适配器中,使用“含有”来实现。如:
容器适配器:
如:stack和queue都是内含一个deque,然后只开放需要的功能,并改改函数名等。

迭代器适配器:
1、rbegin和rend
在这里插入图片描述
2、inserter(重载=,让赋值变为插入)
在这里插入图片描述

函数适配器:
和算法要问迭代器问题一样,函数适配器也要问仿函数一些问题:
在这里插入图片描述

1、binder2nd(固定第二个参数),为了方便使用,STL提供了bind2nd。注:binder2nd和bind2nd都被建议用bind取代。

在这里插入图片描述

2、not1(对仿函数返回值取反)

3、bind
在这里插入图片描述

其他适配器:
1、ostream_iterator
在这里插入图片描述
2、istream_iterator
在这里插入图片描述

其他组件

tuple
将多种基本数据类型组合成一个新的类型。
用法:
在这里插入图片描述
实现:
可以看到模板中有 template… 和 Tail… 的字样,这里 … 不是代码有省略,而是一种语法,表示数量可扩展。(可变参数模板)
tuple初始化时每次赋值一个head,然后继承只包含tail的tuple继续为新head赋值。
在这里插入图片描述
type_traits
如我们之前见到的算法问迭代器的traits一样,traits也可以问类的许多属性。
使用起来如:cout<<is_abstract<myclass>::value;

在这里插入图片描述

OOP(面向对象编程) vs GP(泛型编程)

oop企图将数据和方法联系在一起,即都放到类里。
而gp却想将数据与方法分开来。
gp这样做的好处是:
容器和算法的团队可以各自闭门造车,通过迭代器沟通。

模板的特化

一般认为,一个模板的类或函数可以接收任意的类型作为模板参数(泛化模板)。但是往往会遇到一种情况,就是当你传入的类型为某几种特别的类型时,模板类或函数对这种类型有更高效的实现方法,此时可以使用模板的特化(全特化)。
在这里插入图片描述
偏特化:如,只特化部分模板参数,或特化传入的参数为指针的情况。

零碎知识点

1、前闭后开区间

意思是指begin()迭代器指向第一个元素,而end()迭代器指向最后一个元素的后一个位置。(注,容器空时,begin同于end)

2、容器的遍历

一种老方法就是从begin一直++到end。
从c++11以后就可以使用

for(decl : coll){
    statement
}
//例如
vector<double> myVector;
...
for(auto elem : myVector){
    cout<<elem;
}

3、abort()函数与exit()函数区别

exit和abort都是用来终止程序的函数,他们的不同如下:

exit会做一些释放工作:释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序。如果有函数通过atexit来注册,还会调用注册的函数。不过,如果atexit函数扔出异常的话,就会直接调用terminate。补充一下,如果是用c++的话,exit调用的时候,对象还是不会被正确析构的,所以在exit前一定要释放应该释放的资源,特别内核驻留的像共享内存之类。

abort:立刻terminate程序,没有任何清理工作。

4、所有算法,其中最终涉及到元素本身的操作无非就是比大小。

5、对于整型的++

int i=7;
++++i;	//即++(++i),允许。
i++++;	//即(i++)++,不允许。

6、大小为零的class
如空class或仿函数class,编译器将其大小规定为1。

7、继承typedef
子类可以继承使用父类的typedef,这在STL中常常使用。

8、typedef和typename
类型说明typedef

类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。

类型解释Typename

Typename关键字告诉了编译器把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:
1) 一个唯一的name(可以作为类型理解),它嵌套在另一个类型中的。
2) 依赖于一个模板参数,就是说:模板参数在某种程度上包含这个name。当模板参数使编译器在指认一个类型时产生了误解。保险起见,你应该在所有编译器可能错把一个type当成一个变量的地方使用typename。

C++STL 体系结构与内核分析(侯捷)——课程笔记(一) 本部分包括课程信息和一些基本概念 1. 泛型编程:泛型编程使用template为主要工具,STL就是泛型编程应用的一个绝好示范。 2. C++ Standard Library和C++ Standard Template Library的区别:标准库包括STL,可以认为STL主要包含六大部件,除此之外还有一些东西,和STL组合在一起就构成了标准库。 下面介绍STL体系结构基础: 一、六大部件(Components) 1. 六大部件及其关系 容器(Container),分配器(Allocator) 阅读详情

相关推荐

MFC类库详解+层次结构图

该MFC参考含盖了Microsoft基本类库中的类、全局函数、全局变量和宏的内容。

c++内存管理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。2. 在申请的空间上执行构造函数,完成对象的构造。

2401_84018574的博客 907

C++标准程序库STL的架构

目录 1 前面的话 1 1.1 历史 1 1.2 内容 1 1.3 基础知识 1 1.4 三种境界 1 1.5 STL特点 1 1.6 资源 1 1.7 学习方法 1 2 语言特性 3 2.1 模板 3 2.2 typename 3 2.3 模板类的拷贝构造函数 3 2.4 基本类型数据初始化 3 2.5 异常处理 4 2.6 命名空间 4 2.7 using声明 4 2.8 namespace std 4 2.9 explicit关键字 5 2.10 新的类型转换符 5 2.11 静态常量成员的初始化 6 2.12 时间复杂度O记号 6 3 一般概念 7 3.1 头文件 7 3.2 错误处理和异常处理 7 3.2.1 异常头文件 7 3.2.2 标准异常分类 7 3.2.3 异常规格 8 3.2.4 如何在程序中找出异常类型 8 3.2.5 抛出标准异常和实现自己的异常 8 3.3 配置器 8 4 通用工具 9 4.1 简介 9 4.1.1 类别 9 4.1.2 头文件 9 4.2 Pairs 9 4.2.1 简介 9 4.2.2 示例 9 4.3 auto_ptr 10 4.3.1 作用 10 4.3.2 引入原因 10 4.3.3 声明 10 4.3.4 auto_ptr拥有权的转移 10 4.3.5 示例 11 4.3.6 用途 12 4.4 数值极限 13 4.4.1 引入原因 13 4.4.2 头文件 13 4.4.3 numeric_limits<> 13 4.5 辅助函数 14 4.5.1 max、min 14 4.5.2 swap 15 4.6 头文件<cstddef>、<cstdlib> 15 4.6.1 <cstddef> 15 4.6.2 <cstdlib> 15 5 STL标准程序库 16 5.1 STL组件 16 5.1.1 分类 16 5.1.2 基本观念 16 5.1.3 好处 16 5.2 容器(containers) 16 5.2.1 分类 16 5.2.2 序列式容器示例 16 5.2.3 关联式容器 18 5.3 迭代器 18 5.3.1 示例 19 5.3.2 迭代器分类 21 5.4 算法 21 5.4.1 区间 22 5.4.2 处理多个区间 22 5.5 迭代器的配接器 24 5.5.1 种类 24 5.5.2 Insert Insertors 24 5.5.3 Stream Iterator 25 5.5.4 reverse iterator 25 5.6 变动型算法 26 5.6.1 删除元素 26 5.6.2 变动型算法和关联式容器 27 5.6.3 算法vs.成员函数 28 5.7 使用者自定义的泛型函数 29 5.8 以函数作为算法的参数 29 5.8.1 示例for_each和transform 29 5.8.2 判断式(predicates) 30 5.9 仿函数 33 5.9.1 什么是仿函数 33 5.9.2 预先定义的仿函数 35 5.10 容器内的元素<class T> 36 5.10.1 容器元素的条件 36 5.10.2 value和reference 37 5.11 STL内部的错误处理和异常处理 37 5.11.1 错误处理(Error Handling) 37 5.11.2 异常处理 38 5.12 扩展STL 38 6 STL容器 39 6.1 容器的共同能力 39 6.2 vector 39 6.2.1 vector的能力 39 6.2.2 vector实例 40 6.3 deque 41 6.3.1 Deque的能力 41 6.3.2 Deque的使用时机 41 6.3.3 示例 41 6.4 List 42 6.4.1 list的能力 42 6.4.2 list的操作函数 42 6.4.3 splice函数 43 6.4.4 示例 43 6.5 set和multiset 44 6.5.1 示例 44 6.5.2 set和multiset举例 46 6.6 map和multimap 49 6.6.1 map和multimap的能力 50 6.6.2 将map视为关联式数组 52 6.6.3 map和multimap运用示例 52 6.6.4 综合示例 55 6.7 其它STL容器 57 6.7.1 HashTable 59 6.7.2 引用计数 59 6.8 各种容器的运用时机 61 6.8.1 各种容器的使用时机 61 7 STL迭代器 64 7.1 迭代器头文件 64 7.2 迭代器类型 64 7.2.1 Input迭代器 64 7.2.2 Output迭代器 64 7.2.3 Forward迭代器 65 7.2.4 双向迭代器 65 7.2.5 随机存取迭代器 65 7.2.6 Vector迭代器的递增和递减 67 7.3 迭代器辅助函数 67 7.3.1 advance()可令迭代器前进 67 7.3.2 distance()可处理迭代器之间的距离 68 7.3.3 iter_swap()交换两个迭代器所指内容 68 7.4 迭代器配接器(adapter) 69 7.4.1 逆向迭代器 69 7.4.2 Insert迭代器 72 7.4.3 Stream迭代器 75 7.5 迭代器特性 76 8 STL仿函数 77 8.1 仿函数概念 77 8.1.1 仿函数当做排序准则 77 8.1.2 拥有内部状态的仿函数 78 8.1.3 for_each()的返回值 80 8.1.4 判断式和仿函数 81 8.2 预定义的仿函数 82 8.2.1 函数配接器 82 8.2.2 针对成员函数而设计的函数配接器 83 9 STL算法 85 9.1 算法头文件 85 9.2 算法概览 85 9.2.1 简介 85 9.2.2 算法分类 85 9.3 辅助函数 85 9.4 for_each()算法 86 9.5 非变动性算法 88 9.5.1 元素计数 88 9.5.2 最小值和最大值 88 9.5.3 搜寻元素 89 9.5.4 区间的比较 95 9.6 变动性算法 98 9.6.1 复制元素 98 9.6.2 转换和结合元素 99 9.6.3 互换元素内容 101 9.6.4 赋予新值 101 9.6.5 替换元素 103 9.7 移除性算法 104 9.7.1 移除某些特定元素 104 9.7.2 移除重复元素 105 9.8 变序性算法 107 9.8.1 逆转元素次序 107 9.8.2 旋转元素次序 107 9.8.3 排列元素 109 9.8.4 重排元素 109 9.8.5 将元素向前搬移 110 9.9 排序算法 111 9.9.1 对所有元素排序 111 9.9.2 局部排序 112 9.9.3 根据第n个元素排序 113 9.9.4 heap算法 114 9.10 已序区间算法 115 9.10.1 搜寻元素 115 9.10.2 合并元素 117 9.11 数值算法 120 9.11.1 加工运算后产生结果 120 9.11.2 相对值和绝对值之间的转换 121 10 特殊容器 123 10.1 Stacks 123 10.1.1 核心接口 123 10.1.2 Stack运用实例 123 10.1.3 使用自定义的Stack类 124 10.2 Queue 125 10.2.1 核心接口 126 10.2.2 Queue运用实例 126 10.2.3 使用者自定义的队列 126 10.3 Priority Queue 128 10.3.1 核心接口 128 10.3.2 运用实例 128 10.4 Bitset 129 10.4.1 Bitset运用实例 129 11 Strings 131 11.1 动机 131 11.1.1 示例:引出一个临时文件名 131 11.1.2 例二:引出一段文字并逆向打印 132 11.2 未提供的操作函数 132 11.2.1 大小和容量 132 12 数值 135 12.1 复数 135 12.2 valarray 136 12.2.1 认识valarray 136 12.2.2 valarray的子集 138 13 以stream classes完成输入/输出 143 13.1.1 示例 143 13.2 基本的Stream类别和Stream对象 144 13.3 文件存取 144 13.3.1 重定向 147 13.3.2 用于读写的Stream 147 13.4 String Stream class 148 13.4.1 Stream缓冲区迭代器示例 14 国际化 150149 15 空间配置器

从C++角度看内核与多线程

linux内核使用C写的,文本重点在于理解内核、进程、线程的本质区别

流星雨的博客 850

用c++写一个最简单的内核(只有几百行代码,编译通过)

用c++写一个最简单的内核(只有几百行代码,编译通过)

MFC类库详解及结构体系图

MFC4_21.jpg MFC6_0.jpg MFC7_0.jpg MFC类库详解.chm

C/C++后端工程师的圣地—内核殿堂(含学习路线)

其中可以看到三个层次:用户空间、内核空间、硬件。

嵌入式Linux内核的博客 1295

电力远动入门:手把手解析IEC 60870-5-101规约的帧结构与报文交互(基于DL/T634.5101-2002)

本文深入解析IEC 60870-5-101规约的帧结构与报文交互,适用于电力远动通信系统。通过详细讲解规约的基础架构、控制域位定义及典型报文交互流程,帮助工程师快速掌握101规约的核心技术,提升电力自动化系统的调试与维护能力。

weixin_27076351的博客 245

c++ 实现简单的操作系统内核

c++ 实现简单的操作系统内核

路过的熊的博客 1008

川崎机器人总线通信_三菱PLC和发那科机器人进行CCLINK总线通信

三菱CCLINK主站模块采用QJ61BT11N,该模块用在Q系列PLC上,如果是5U或3UPLC,可用FX5-CNV-BUS加FX3U-16CCL-M或FX5-CCL-M模块。本教程以Q系列为例CCLINK接线方法如下模块拨码含义如下接线和拨码设置好后,接着在编程软件上设置CCLINK通信参数打开编程软件,在工程导航栏打开参数——网络参数,选中CCLINK打开。打开如下画面起始IO为模块本体占用I...

weixin_42300398的博客 7551

从零构建虚幻引擎体积云:参数调优与性能平衡的艺术

本文深入探讨了在虚幻引擎中构建逼真体积云系统的关键技术,包括Sky Atmosphere、Volumetric Cloud和Exponential Height Fog三大核心组件的协同工作。重点解析了体积云材质的高级控制、光照阴影的物理模拟以及性能优化策略,帮助开发者在视觉效果与性能之间找到最佳平衡点。

weixin_29012677的博客 938

侯捷 C++ 课程学习笔记:C++ 标准库的体系结构与内核分析

C++ 标准库(C++ Standard Library)和标准模板库(Standard Template Library, STL)是 C++ 语言的重要组成部分。同时,理解标准库的实现原理,有助于更好地应用标准库的各种功能,提高开发效率。帮助学生深入理解 C++ 标准库的体系结构和内核原理,从而更好地使用和扩展 C++ 标准库。是 C++ 标准库的一部分,提供了各种通用的模板类和函数,如容器、算法、迭代器等。深入理解 C++ 标准库的体系结构和内核原理,了解标准库的实现机制。

m0_74107848的博客 526

VOS中历史话单显示通话会话超时中断详解

假设一种场景:  主叫拨打被叫,主叫方异常离线,被叫方接听,被叫方发送200ok至VOS,VOS传送200ok给主叫,但是主叫方未给出正常ack回应,VOS重发几次后(根据SIP参数设定的重发机制),然后VOS服务器会中断话务,历史话单终止原因为会话超时。 参考呼叫分析信令如下图: ...

非著名运维的博客 5017

C++标准库体系结构与内核分析学习笔记——C++标准库基础小知识

C++标准库基础小知识     首先申明一点,这个系列的笔记是在学习侯捷老前辈的《C++标准库—体系结构与内核分析》课程中的过程中的笔记,记录了课程中的诸多知识点,同时也会加入自己的一些理解,或者将自己理解的知识点以自己的语言表达出来。个人非常喜欢以及认同侯捷老前辈的一个观点:胸中自有丘壑。    C++标准库不再是C语言库那样子由一个个分散函数组成的,C++标准库是由不同的部分相互关联组织成的一...

smallerxuan的博客 826

在 ABAP 平台上搭建 OAuth 2.0 Server:架构、流程、权限与落地实战

摘要:本文为SAP ABAP开发人员提供将ABAP平台配置为OAuth 2.0授权服务器的实战指南。重点介绍两种授权流程(授权码和SAML Bearer)的实现方案,包括核心事务配置(SOAUTH2/SAML2)、授权对象(S_SCOPE)管理以及端点交互规范。通过具体配置清单和三类典型集成场景(第三方Web应用访问OData、企业集成平台调用、BTP应用对接)的落地示例,帮助读者快速构建安全的OAuth 2.0服务架构。文档强调SSL/TLS基础安全、scope最小授权原则以及授权与令牌端点的标准交互模式

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 311

【从零开始入门unity游戏开发之——C#篇37】进程、线程、C# 中实现多线程有多种方案和async/await异步编程

进程、线程、C# 中实现多线程有多种方案和async/await异步编程

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1470

C++标准库体系结构与内核分析学习笔记——C++STL基础结构

C++STL基础结构一、STL组成    C++STL主要由6个组件(Components)组成,分别是:容器(Containers)、分配器(Allocators)、算法(Algorithms)、迭代器(Iterators)、适配器(Adapters)、仿函数(Functors)。二、基本介绍    容器(Containers)是什么?可以理解为已经实现了的,功能完善的数据结构的集合,不同的容器...

smallerxuan的博客 1046

【技能】OpenClaw Memory 与 MemOS 两种 AI 记忆方案深度解析

摘要:本文对比了两种AI记忆系统方案。OpenClaw Memory是轻量级记忆助手,内置SQLite存储,支持语义搜索,部署简单成本低,适合日常对话记忆需求。MemOS是自学习系统,通过Neo4j和Qdrant实现技能自进化,但需部署4套服务,门槛高成本大。建议普通用户选择OpenClaw Memory,技术玩家可逐步尝试MemOS。两种方案各具优势,需根据实际需求选择。

海兰 199

笔记 | C++标准库体系结构与内核分析

笔者最近学习了侯捷教授的课程,《C++标准库体系结构与内核分析》,讲的很细,我之前一些笔面试答不上来的问题到如今也能够迎刃而解了。话不多说,这里将所有课程中的知识点汇总在这里,方便各位学习交流。

2302_79769914的博客 1078

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论!

黄团团的个人博客 2612

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++标准库-体系结构与内核分析】STL源码到底在哪里可以看到?

1.VC VC版本可以在VS中的VC中看到,我这里给出的版本是VS2015中的VC的目录.VC的分布相对于G++/GCC还是比较清晰的. VS中的VC 头文件: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include STL源码: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\crt\src\stl 2.G++/GCC 1.老师说 侯捷老师强烈推荐2.9.1版本

Edidaughter的博客 4815

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

侯捷——2.C++标准库 体系结构与内核分析

allocators(分配器)是给containers(容器)分配内存的。当要创建容器时,必须先有分配器分配内存。在创建容器时,可以指定分配器,也可以不指定,编译器会默认指定分配器。

壹的博客 561

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++标准库STL体系结构与内核分析

总结 泛型编程,就是以模板为主要工具来编写程序 STL是范型编程最成功的作品,以下是根据STL探讨泛型编程 目标 使用C++标准库 认识C++标准库(深入认识C++标准库,非常清楚部件在内存中的实现) 良好使用C++标准库(熟悉标准库的体系结构) 扩充C++标准库 标准库 一个C++编译器会提供很多头文件,以文件而不是编译好的东西,可以看到源代码,这就是c++标准库 c++标准库包括STL以及一些其它的小组件 一、STL体系结构与基础介绍 STL六大部件简介、容器的遍历 对应1

Mirevas的博客 259

C++标准库体系结构&参数化模型

进程是程序的一次执行,是操作系统分配资源的单位,多个进程是可以并发执行的,并发执行实际上每个时刻执行的还是一个进程,只不过进程间切换的速度比较快,给人的感觉是并发执行。&:带&函数形参,使用并接收返回值,而 & 叫做引用符,它是 C++ 的内容(目前多数 C 语言编译器也能使用),它可以引用主函数中 x 的地址,而不在调用的函数栈帧中开辟空间,这样就可以对主函数中的 x 进行修改。池化技术:提前保存大量资源,来备用资源或重复使用资源,内存池,(Socket/)线程池,连接池,对象池,

qq_52690703的博客 1074

STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)

STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)

世界仙境与冷酷尽头's Blog 7848

深入 Rust 标准库,Rust标准库源代码系统分析

深入 Rust 标准库本书深入分析了Rust标准库的源代码,并厘清了分析Rust标准库源代码的脉络。全书共14章。第1章对Rust标准库体系进行了概述性介绍;第2章分析了Rust的一些独特性;第3~8章分析了CORE库与ALLOC库,这两个库可用于编写操作系统内核与用户态应用程序;第9~13章分析了STD库,STD库仅用于编写用户态应用程序;第14章对异步编程进行了简单分析。本书试图以标准库的源代码为基础分析Rust的一些最本质的内容,从而加快程序员掌握Rust的进程。

Java 技术专栏,从入门到精通,熟悉企业级开发 1万+
上一篇: c++学习 函数对象(仿函数)
下一篇: Linux系统训练模型进程被killed,其实类似于显存out of memory
narbit
博客等级 码龄7年 19粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值