## OOP&GP ##

OOP企图将datas和methods关联在一起,GP则是将datas和methods区分开。
使用全局sort必须提供RandomAccessIterator。

clipboard.png

使用GP,Containers和Algorithms可以各自闭门造车,其间以Iterator联通即可。
Algorithms通过Iterator确定操作范围,并通过Iterator取用container的元素。所有algorithm其内最终涉及元素本身的操作,无非就是比大小。
它们之间的关系

clipboard.png

OPerator Overloading

clipboard.png

clipboard.png

clipboard.png

Class Template

clipboard.png

Function Template

clipboard.png

Member Template

clipboard.png

Allocator

分配器(Allocator)是容器管理内存的工具,在容器申请内存空间上起作用。分配器在底层实现上通过operator new()和operator delete()来完成内存分配和释放,而operator new()和operator delete()实际上是通过调用malloc()和free()函数来实现操作。operator new()和operator delete()的源代码如下:

clipboard.png

  • VC6的Allocator

clipboard.png

  • BC5的Allocator

clipboard.png

  • G2.9的Allocator

clipboard.png

  • G4.9的Allocator

clipboard.png

由以上各编译器中allocator的源代码可以看出,无论是VC、BC还是GNU的版本中分配器实际上是通过operator new和operator delete来调用malloc和free来管理内存。但是在GNU2.9中,容器实际使用的并非是allocator,而是alloc。

clipboard.png

其实现如下:

clipboard.png

管理也是通过malloc和free,但是可以避免其他额外开销,比如cookie,实现过程如下:
(1)设计了16条链表,每条链表负责某种特定大小的区块,比如第0条链表负责8个字节大小的区块,第1条负责16个字节,以此类推,即(标号数+1)*8;
(2)容器的元素大小都会调整到8的倍数,比如50的会调整到56,然后交给第6条链表负责;
(3)分配器查看链条有没有挂内存块,如果没有,向操作系统要内存,得到的内存块除了头尾有cookie,中间的每一小块内存都不带cookie;

clipboard.png

容器的结构与分类

clipboard.png

  • Iterator

迭代器必须能够回答算法的提问
它必须提供五种associated types

clipboard.png

  • list

list的结构
clipboard.png

clipboard.png

clipboard.png

list的iterator

clipboard.png

  • traits

clipboard.png

clipboard.png

clipboard.png

  • vector

clipboard.png

  • array

clipboard.png

  • forward_list

clipboard.png


风斩冰华
27 声望12 粉丝

coding