Boolan STL 第二周笔记

本文探讨了面向对象编程(OOP)与通用编程(GP)的区别,特别是这两种编程范式在C++中的应用。文章介绍了如何利用GP中的容器和算法进行高效编程,并深入讨论了内存管理中的分配器概念及其不同实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

## 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值