08 2023 档案
摘要:STL中算法 是 function template。 算法看不见容器,对其一无所知,所以它所需要的一切信息都必须从itertor取得,而iterators(由容器提供)必须能够回答算法的所有提问,才能搭配该算法的所有操作。 迭代器的分类: struct input_iterator_tag {};
阅读全文
摘要:vector 容器的增长是当容量不够时,就找到一块二倍大的空间,将原来的内容复制到新空间。每一次复制伴有大量的拷贝构造和析构函数的调用,开销大。vector 里面有 begin end end_of_storge 三个迭代器(指针)。 list本质是一个双向链表,list类模版里面含有迭代器,lis
阅读全文
摘要:STL六大部件 容器 (class template) 分配器(为容器服务,class template) 算法 (function template) 迭代器(泛化的指针,容器和算法之间的桥梁)(class template) 适配器 (class template) 仿函数 (class tem
阅读全文
摘要:相关数据结构:blocks,super-blocks,bitmap,mini-vector block:分配单元,super-block:管理单元 super_block_size = usecount + bitmap + blocks * block_size mini-vector 是控制单元
阅读全文
摘要:三个class,第一层是chunk,第二层是vector<chunk> FixedAllocator,第三层是vector<vector<chunk>> SmallObjallocator。第一层的chunk负责实际内存的管理,一个chunk管理一个unsigned char[blockSize *
阅读全文
摘要:static static函数没有this pointer,static数据只有一份,static函数只能处理static数据。static数据在class外需要提供定义。 单例设计 class A{ public: static A& getInstance(); setup() {...} pr
阅读全文
摘要:Object Based:面对的是单一class的设计;Object Oriented:面对的是多重classes的设计,classes和classes之间的关系。 class 前向声明,声明,定义。 函数若在class body中定义完成,便自动成为inline函数。如果函数太复杂就不会成为inl
阅读全文
摘要:new的动作:默认调用全局operator new ,指针转型,构造。delete的动作:析构,然后默认调用全局operator delete。全局的operator new & 全局的operator delete 就是做malloc & free。如果operator new & operato
阅读全文
摘要:设计主要目的:减少malloc的cookie的开销 设计主要方法:减少malloc的次数,用数据结构管理已经分配的内存。 核心数据结构:free_list[16]存储16根链表头,free_list[i],0~15 ,free_list[i]管理(i + 1)*16字节型区块。 客户所需要内存块大小
阅读全文
摘要:让接口容易被正确使用,不易被误用 任何接口如果要求客户记得做某些事情,就是有着“不正确使用”的倾向。 设计class犹如type C++ 就像在其他OOP语言一样,当你定义一个新class,也就定义了一个新type。身为C++程序员,你的许多时间主要用来扩张你的类型系统。这意味着你不只是class设
阅读全文
摘要:const 成员函数,表示this 是一个指向常量的指针。常量对象以及常量对象的引用或指针都只能调用常量成员函数。 this 的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址。 只有当类没有声明任何构造函数时,编译器才会自动的生成默认构造函数 构造函数,会在
阅读全文
摘要:当把string 对象和子符字面值混在一条语句中使用时,必须确保每个 + 运算符的两侧的运算对象至少有一个是string 用花括号对vector做初始化,不能用下标形式添加元素 迭代器,iterator const_iterator 两种迭代器类型,如果vector 或 string 对象是常量,只
阅读全文
摘要:= 赋值运算符优先级较低,赋值运算符满足右结合律 *p++ 相当于 *(p++) p++ ++p 不同的行为值得注意 以下情况可能发生类型转换:比int 类型小的整数值首先提升为较大的整数类型;函数调用时;算数运算时;初始化时; 显示类型转换 static_cast const_cast reint
阅读全文
摘要:不要返回局部对象的引用或指针 函数重载:同一作用域内的几个函数名字相同但形参列表不同(形参的个数或类型不同) 一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来,底层const 可以区分 const_cast 和重载联系紧密 如果我们在内层作用域中声明名字,它将隐藏外层作用域中
阅读全文
摘要:编译器可能会做类型转换 切勿混用带符号类型和无符号类型 C++中初始化和赋值是两个完全不同的操作 未初始化的变量含有一个不确定的值 作用域是嵌套的 全局变量不显示初始化会得到0,局部变量不可以不初始化,全局变量之间不要有初始化关联。 不要返回本地变量的地址(本地变量的地址在程序结束后不可控),返回全
阅读全文
摘要:进程地址空间,进程虚拟内存的管理。某个进程地址空间的全部区域可以以红黑树+链表的形式存放。 内核线程没有mm_struct没有进程地址空间,没有相关的内存描述符,这也是内核线程的真实含义--它们没有用户上下文。当一个进程被调度时,该进程的mm域指向的地址空间被装载到内存,PCB中的active_mm
阅读全文
摘要:虚拟文件系统作为内核子系统为用户空间程序提供了文件和文件系统相关的接口。VFS之所以能衔接各种各样的文件系统,是因为它定义了所有文件系统都支持的基本的,概念上的接口和数据结构。 Unix文件系统相关的抽象概念:文件,目录项,索引节点,安装节点。在Unix中,文件系统被安装在一个特定的安装点上所有的已
阅读全文
摘要:内核把物理页作为内存管理的基本单位,内核用一个page结构体表示内核中的每个物理页。 Linux把系统的页划分为区,形成不同的内存池,根据用途分配。区只是内核为了管理页而采用的一种逻辑上的分组。 一些分配释放相关函数 alloc_pages,该函数分配连续的物理页,返回一个指针指向第一个页的page
阅读全文
摘要:中断和中断处理 中断就是由硬件来打断操作系统,内核会随时响应中断。 中断处理程序就是普通的C函数,不过它们运行在中断上下文中(原子上下文)。中断不能被阻塞,这限制了它们所能做的事情。 上半部和下半部,中断处理程序是上半部,能够被允许稍后完成的工作会推迟到下半部。例子:网卡接受数据,拷贝最新的数据到内
阅读全文
摘要:进程管理 在现代操作系统中,进程提供两种虚拟机制,虚拟处理器和虚拟内存 PCB描述一个正在执行的程序:打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程。 在2.6以前的版本中,PCB直接放在内核栈的尾端,或者放一个pcb_info间接索引,这
阅读全文