1、C++php
内存管理html
1. 内存分配区域node
栈、堆、自由存储区、全局区、常量区。linux
[常量数据(const data)区:] 常量数据区存储字符串等在编译期间就能肯定的值。类对象不能存在于这个区域中。在程序的整个生存周期内,区域中的数据都是可用的。 区域内全部的数据都是只读的,任何企图修改本区域数据的行为都会形成没法预料的后果。之因此会如此,是由于在实际的实现当中,即便是最底层的内部存储格式也受制于所实现的特定的优化方案。例如,一种编译器彻底能够把字符串存放在几个重叠的对象里面――只要实现者愿意的话。 [栈(stack)区:] 栈区存储自动变量(automatic variables)。通常来讲,栈区的分配操做要比动态存储区(好比堆(heap)或者自由存储区(free store))快得多,这是由于栈区的分配只涉及到一个指针的递增,而动态存储区的分配涉及到较为复杂的管理机制。栈区中,内存一旦被分配,对象就当即被构造好了;对象一旦被销毁,分配的内存也当即被收回(译注:这里做者用了“去配(deallocate)”一词,鄙人一概翻译为“回收”)。所以,在栈区中,程序员没有办法直接操纵那些已经被分配但尚未被初始化的栈空间(固然,那些经过使用显式(explicit)析构函数(destructor)和new运算符而故意这么作的状况不算在内)。 [自由存储区(free store):] 自由存储区(free store)是C++两个动态内存区域之一,使用new和delete来予以分配和释放(freed)。在自由存储区(free store)中,对象的生存周期能够比存放它的内存区的生存周期短;这也就是说,咱们能够得到一片内存区而不用立刻对其进行初始化;同时,在对象被销毁以后,也不用立刻收回其占用的内存区。在对象被销毁而其占用的内存区还未被收回的这段时间内,咱们能够经过void*型的指针访问这片区域,可是其原始对象的非静态成员以及成员函数(即便咱们知道了它们的地址)都不能被访问或者操纵。 [堆(heap)区:] 堆(heap)区是另外一个动态存储区域,使用malloc、free以及一些相关变量来进行分配和回收。要注意,虽然在特定的编译器里缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,可是堆(heap)与自由存储区(free store)是不一样的――在某一个区域内被分配的内存不可能在另外一个区域内被安全的回收。堆(heap)中被分配的内存通常用于存放在使用new的构造过程当中和显式(explicit)的析构过程当中涉及到的类对象。堆中对象的生存周期与自由存储区(free store)中的相似。 [全局/静态区(Global/Static):] 全局的或静态的变量和对象所占用的内存区域在程序启动(startup)的时候才被分配,并且可能直到程序开始执行的时候才被初始化。好比,函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化的。对那些跨越了翻译单元(translation unit)的全局变量进行初始化操做的顺序是没有被明肯定义的,于是须要特别注意管理全局对象(包括静态类对象)之间的依赖关系。最后,和前面讲的同样,全局/静态区(Global/Static)中没有被初始化的对象存储区域能够经过void*来被访问和操纵,可是只要是在对象真正的生存周期以外,非静态成员和成员函数是没法被使用或者引用的。
若是细分的话,malloc的在堆上,new的在自由存储区。详细参考ref10.git
因此,通常的局部变量、函数参数都是在栈上,new分配的在堆上,malloc分配的在自由存储区,static静态变量和全局变量在全局/静态存储区,字面常量在常量区。程序员
须要注意的是,不少文章(包括底下的ref) 在整理的时候说还有代码段、数据段,这不是一个概念。详见此贴。代码段、数据段、栈是CPU级别的逻辑概念,堆是语言级别的逻辑概念。github
代码段、数据段、堆栈段,这是一个概念。 (参考 APUE ch7.6 & ref11)(这两个讲的都很好)算法
数据段分为未初始化数据段(BSS)和初始化数据段。其中未初始化数据段(BSS)里存放未初始化的全局变量,初始化数据段里存放已初始化的全局变量。
堆、栈、全局区、常量区,这是另外一个概念。(细分的话能够加上自由存储区)设计模式
ref1:Exceptional C++ Item35 ref2 ref3 ref4 ref5 ref6 ref7 ref8 ref9 ref10 (有不少重合内容。主要看不重合的部分。) 安全
语言基础
1. 虚函数和纯虚函数 ref ref2 ref3 【这几篇ref都很好,包括例子也都看一下】
3. C++接口与实现分离 ref
5. 理解复杂的C/C++声明 ref
Effective C++
1. 理解接口继承规则 ref
STL
库函数
2、数据结构
常见算法、数据结构复杂度 http://bigocheatsheet.com/
关于树(2-3树,红黑树,B树,B+树):
红黑树是对2-3树的一种简单版的实现;
B树是对2-3树的扩展(从要求每一个节点有2-3个子树扩展到能够有m个);
B+树是对B树的进一步扩展(
1. 内部节点不存储键值关联的附属数据,因此内部节点节省的空间能够存放更多的键值。也就意味着从磁盘存取一页时可得到更多的键值信息。 2. 叶节点造成了一个链,因此对树的全扫描就是对全部叶节点的线性遍历。
1. 红黑树
红黑树本质上是二叉查找树,但它在二叉查找树的基础上增长了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。
2. B树
3、操做系统
1. Unix文件系统/inode
ref: 鸟哥的私房菜 第8章 Linux磁盘与文件系统管理
4、设计模式
1. C++单例模式写法? 如何定义一个只能在堆上定义对象的类?栈上呢?
5、海量数据相关
http://blog.csdn.net/v_july_v/article/details/7382693
hadoop
1. 简单例子,如wordCount等