Week7(Boolan)

2017-06-01  本文已影响0人  DangerousMan

源代码之分布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版本)

上一篇 下一篇

猜你喜欢

热点阅读