(1)在阅读vs2019上的 STL库的 map 源码时,遇到了这个函数,之前,在别的源码中也经常出现这个函数。那么这个函数起什么作用呢?
在1880行,有对该函数的调用。其定义如下图:,青色箭头所指。
(2)该函数的形参是两个引用。在函数_Move_assign 中,实参是对两个分配器的引用,咱们c++ 里,STL 提供了一个标准分配器,就是allocator模板类。这两个引用都是对allocator对象的引用。
(3)allocator模板类的定义如下图,这里对模板类中一些不重要的函数修饰符去掉了,以突出重点,方便阅读。
如图所示,allocator模板,定义了默认的空的copy构造和copy赋值运算符函数。没有定义移动构造和移动赋值运算符函数。根据 c++ 语法。会代替调用其copy赋值运算符函数。但该函数为空。所以什么也不做。所以在 _Pocma 函数里,没有执行任何修改数据的代码。换句话说,有没有这行代码都一样。
(4)为了验证上面的想法,咱们修改一下电脑vs2019携带的源文件。即修改allocator模板类,如下,在copy赋值运算符函数里打印:
这里直接修改了 源文件。实验一下
(5)来一个实验代码如下:
图中的输出 “yes” 是怎么来的呢,就是因为修改了allocator模板源代码引起的。这非常神奇,也验证了咱们一丝不苟的治学精神,和融会贯通的学习方法,和我们王建伟老师的伟大教学功绩。王老师教的好,才有咱们学的好。
(6)实际上,一开始我不明白这些,是通过反汇编调试看汇编代码时,发现其执行代码没有有效的指令行。才写这篇文章,并回忆起来这个对象复制,对象移动的知识的。谢谢阅读
(7)接着,我们来分析类似的函数 _Swap_adl (…),该函数也经常出现在STL库源码中。如下图
在STL库