首页 > 解决方案 > __is_trivially_copyable 如何在 g++ stl 中实现?

问题描述

在 stl 算法中,当值类型是 triviall copyable 时,复制算法会使用 memmove 来加速这个操作。我发现在文件“type_trait”中,它使用以下代码来检查对象是否可以轻松复制:

template<typename _Tp>
struct is_trivially_copyable
: public integral_constant<bool, __is_trivially_copyable(_Tp)>
{ };

问题一:__is_trivially_copyable 是在哪里实现的?我使用 grep 搜索整个“包含”目录,找不到 __is_trivially_copyable 的定义。

问题2:stl如何检查begin iterator和end iterator之间的内存分配是否连续?例如,如果迭代器属于出队,那么我们必须为每个元素调用移动操作,而不是像向量或数组中的一个 memmove。

标签: c++stl

解决方案


A1:@HolyBlackCat 是正确的;__is_trivially_copyable是编译器内在的。没有真正的方法可以告诉(在语言中)任意类型是否可以轻松复制。

A2:标准库查看迭代器是否是原始指针(与某些类相反)。如果迭代器是指针,那么内存是连续的。(其他迭代器类型可能支持连续内存,但一般无法检测到)


推荐阅读