美文网首页
Week7(Boolan)

Week7(Boolan)

作者: DangerousMan | 来源:发表于2017-06-01 21:19 被阅读0次

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

    相关文章

      网友评论

          本文标题:Week7(Boolan)

          本文链接:https://www.haomeiwen.com/subject/ilrsfxtx.html