как __is_trivially_copyable реализован внутри g ++ stl? - PullRequest
1 голос
/ 18 июня 2020

В алгоритме 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, то мы должны вызывать операцию перемещения для каждого элемента, а не только для одного memmove, как в векторе или массиве.

1 Ответ

1 голос
/ 18 июня 2020

A1: @HolyBlackCat правильный; __is_trivially_copyable - это встроенный компилятор c. Нет реального способа сказать (на языке), можно ли копировать произвольный тип тривиально.

A2: Стандартная библиотека проверяет, являются ли итераторы необработанными указателями (в отличие от некоторого класса). Если итераторы являются указателями, то память непрерывна. (Другие типы итераторов могут поддерживать непрерывную память, но в целом это невозможно обнаружить)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...