在stl算法中,当值类型是可复制的时候,复制算法会使用memmove来加速这个操作。我发现在 "type_trait "文件中,它使用了以下代码来检查一个对象是否是可复制的。
template<typename _Tp>
struct is_trivially_copyable
: public integral_constant<bool, __is_trivially_copyable(_Tp)>
{ };
问题1:__is_trivially_copyable在哪里实现?我用grep搜索整个 "include "目录,找不到__is_trivially_copyable的定义。
问题2:stl如何检查开始迭代器和结束迭代器之间的内存分配是连续的? 例如,如果迭代器属于dequeue,那么我们必须对每一个元素调用move操作,而不是像向量或数组那样只调用一次memmove。
A1: A1: @神圣的黑猫是正确的; __is_trivially_copyable
是一个编译器固有的。没有真正的方法来判断(在语言中)一个任意类型是否是可复制的。
A2:标准库会看迭代器是否是原始指针(而不是某个类)。如果迭代器是指针,那么内存是连续的。(其他迭代器类型可能支持连续内存,但一般情况下没有办法检测)