c++,标准库std中全局函数 _Destroy_in_place(...)的分析

(1)该函数的定义和位置如下:
c++,标准库std中全局函数 _Destroy_in_place(...)的分析_第1张图片

可见,传入形参为某种类型的引用,该函数会执行形参的析构函数,还可以有效解决数组的连续析构。很强大的函数。
(2)疑问是,若形参是指针类型,该函数怎么执行,指针类型是没有析构函数的。
(3)举例,如下代码和实验结果:
c++,标准库std中全局函数 _Destroy_in_place(...)的分析_第2张图片
可见,当该函数的形参是指针类型,没有析构和构造函数,该函数不执行具体的内容,什么也不做。
(4)我们可以以汇编代码跟踪一下,上面代码的反汇编代码如下:
c++,标准库std中全局函数 _Destroy_in_place(...)的分析_第3张图片
如图,开始执行第22行代码,按F11 继续进入这个全局函数得汇编代码:
c++,标准库std中全局函数 _Destroy_in_place(...)的分析_第4张图片
可见,当形参类型是指针时,该函数什么也没做。或者说指针类型是c++内置类型,c++编译器给指针类型规定的构造和析构函数中,就是没有任何代码,空函数体的。实际看汇编代码,根本就没有跳转,比如转至指针的析构函数执行。直接就ret返回了。这个奇怪现象,有别于真正的数据类型。也是本文探讨验证的初衷。以更多的了解该函数。
(5)该函数在vs2019上阅读STL源码时,频繁出现。有些数据结构里有指针类型的成员。STL总对指针调用_Destroy_in_place(…)。如图,举例是在单向链表forward_list 的源码中,在函数clear() 中。
c++,标准库std中全局函数 _Destroy_in_place(...)的分析_第5张图片
c++,标准库std中全局函数 _Destroy_in_place(...)的分析_第6张图片
如此,就解开了对指针应用该函数的疑惑,相当于什么也没做。谢谢阅读

你可能感兴趣的:(c++学习总结,c++容器类模板的相关源码分析,c++,开发语言)