Оптимизации std::copy/memcpy/memmove
Я посмотрел в GCC STL (4.6.1) и увидел, что std::copy()
использует оптимизированную версию в случае встроенного __is_trivial()
оценивает true
,
Так как std::copy()
а также std::reverse_copy()
Шаблоны очень полезны для копирования элементов в массивах, я бы хотел их использовать. Тем не менее, у меня есть некоторые типы (которые являются результатом создания шаблонов), которые являются структурами, которые содержат некоторые тривиальные значения, без указателей и не имеют конструктора копирования или оператора присваивания.
G++ достаточно умен, чтобы понять, что мой тип на самом деле тривиален? Есть ли способ в C++98, чтобы убедиться, что реализация STL знает, что мой тип тривиален?
Я думаю, что в C++11 все станет удобно, используя is_trivial<>
тип черта. Это правильно?
Спасибо!
РЕДАКТИРОВАТЬ: Извините за то, что так поздно с этим, но вот пример довольно простой Type
класс, который не является тривиальным для GCC и llvm. Есть идеи?
#include <iostream>
struct Spec;
template <typename TValue, typename TSpec>
class Type
{
public:
TValue value;
Type() : value(0) {}
};
int main()
{
std::cerr << "__is_trivial(...) == "
<< __is_trivial(Type<char, Spec>) << '\n';
return 0;
}
2 ответа
Там были некоторые споры о том, что trivial
означало.
Например, ваш пример не является тривиальным, насколько я могу судить (std::is_trivially_default_constructible
вернул бы ложь я думаю).
В вашем случае, я думаю, вам понадобится новая черта std::is_trivially_copyable
, который является более мелкозернистым. Итак... обновить свой компилятор?
__is_trivial
дает правильное значение для всех типов.
Вы не можете полагаться на какую-либо специфическую реализацию STL, чтобы использовать ее, хотя, если поставщик компилятора предоставил ее, то, вероятно, она содержит различные специфичные для компилятора улучшения за кулисами.
C++ 11-х std::is_trivial
просто стандартизирует эту функцию, у реализации нет причин не использовать ее.