Оптимизации 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 просто стандартизирует эту функцию, у реализации нет причин не использовать ее.

Другие вопросы по тегам