std::copy/memcpy/memmove optimizations

Я заглянул в GCC STL (4.6.1) и увидел, что std::copy() использует оптимизированную версию в случае, если встроенный __is_trivial() имеет значение true.

Поскольку шаблоны std::copy() и std::reverse_copy() очень полезны для копирования элементов в массивах, я хотел бы их использовать. Однако у меня есть некоторые типы (которые являются результатом инстанцирования шаблонов), которые являются структурами, содержащими некоторые тривиальные значения, без указателей и не имеют конструктора копирования или оператора присваивания.

Достаточно ли умна G++, чтобы понять, что мой тип на самом деле тривиальный? Есть ли в C++98 способ убедиться, что реализация STL знает, что мой тип тривиальный?

Я предполагаю, что в C++11 все станет удобнее с использованием признака типа is_trivial<>. Так ли это?

Спасибо!

EDIT: Извините, что так поздно, но вот пример довольно простого класса 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;
} 
7
задан Manuel 18 January 2012 в 16:53
поделиться