源代码之分布VC GCC
gnu 2.91 标准库是用generic programming写成的,将data和methods分开来,借助iterator迭代器让methods获取data
list不能用::sort()排序是因为全局的sort要求传入的iterator属于random access iterator类型,可以类似指针一样进行+、-、*、/的操作,而list这种容器是由指针链接的一个个节点构成,并不连续,不能进行+、-、*、/操作。
字符串默认的比大小方式是字典序,不论长度。
操作符重载
对于iterator来说,因为它是泛化的指针,所以对它需要重载可以用在指针上的各种操作符
模板
template <class T>或template <typename T>都可以
类模板在使用时必须标注类型,而函数模板在使用时可以通过argument deduction实参推导
特化 template<>
例一 例二 例三偏特化
多个模板参数,只绑定其中一个
struct iterator_traits<T*>范围上的偏特化
回归到c语言的malloc,再调用操作系统API拿到内存。
VC,BC,GNUC4.9下
allocate---->operator new---->malloc---->附加部分大小基本固定,其比例随着所取内存大小减小而增加,额外开销也增加
deallocate---->operator delete---->free
allocate<int>()临时的int类对象
GNUC2.9下更好的allocator,设计了16个链表,分别用于存储整数倍8个字节的元素,元素最大可为8*16=128字节,减少了调用太多次malloc所造成的cookie引起的开销,在GNUC4.9下改名为__pool_alloc,用法:
蓝色部分为容器本身大小,与容器中的元素多少即大小无关,GNUC4.9版本下list为8字节是因为list的结构被重新设计成复杂的关系,最终还含有环状结构的end指针。list要内存时以每个节点为单位,而每个节点包括了元素本身和指向前后节点的两根指针
除了array和vector之外所有容器的iterator都必须是class,才能有“智能”,即iterator++会指向下一个节点。所有容器的iterator都至少有5个typedef,并且有一堆操作符重载
1.拷贝构造=优先于*,而=又北重在,使得*作为参数并没有调用起重载后的*
2.因为int++++的操作是不允许的,所以将i++的返回类型设计为不带引用。
*及->的重载思路代码规范(从GNUC2.9到4.9版本)
网友评论