(1) 我们写 c++ 代码,使用 STL 库中的模板,很少自己写对象的分配器。用 STL 中的分配器也够用。研究 STL 中的分配器也可以为咱们自己写分配器提供参考。
咱们会遇到这样的场景,例如交换两个容器对象: list a ,b ; a .swap (b) ; 这样的代码使用的 STL 源码调用如下图:
成员函数进行了俩对象的交换操作。其中使用了全局函数 _Pocs ,其进行俩 list 对象的分配器的交换。其源码如下:
对于两个 list 链表,使用的默认的分配器将都是 STL 中的类, allocator 。关于 标准 allocator 的 traits 模板中,swap 属性是 false 。意思是不支持对象交换。 在函数 _Pocs 中会因此执行 else 分支。在断言 中 left == right ,即认为分配器相等,程序执行时不报错。相当于 两个 list 对象交换时不必交换分配器,因为它们使用的是相同的分配器。以下编写例子验证以下:
(2)测试代码如下:
(3)为了检测 _Pcos 函数,咱们为其加上输出语句:
再次测试:
可见,跟咱们的预想是一致的。
(4) 看来要分析下allocator 模板的比较操作是怎么执行的:
(5)反汇编跟踪一下,找到相关的 operator== 这个函数,看看其内容 :
再专门测试一下:
谢谢阅读