оптимизации std :: copy / memcpy / memmove - PullRequest
7 голосов
/ 18 января 2012

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

, так как std::copy() и *Шаблоны 1007 * очень полезны для копирования элементов в массивах, я бы хотел их использовать.Тем не менее, у меня есть некоторые типы (которые являются результатом создания шаблонов), которые являются структурами, которые содержат некоторые тривиальные значения, без указателей и не имеют конструктора копирования или оператора присваивания.

Достаточно ли умен 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 ]

5 голосов
/ 18 января 2012

Были споры о том, что означает trivial.

Например, ваш пример, насколько я могу судить, не является тривиально конструктивным (я думаю, что std::is_trivially_default_constructible вернет false).

В вашем случае, я думаю, вам нужна новая черта std::is_trivially_copyable, которая более мелкозернистая Итак ... обновить свой компилятор?

4 голосов
/ 18 января 2012

__is_trivial дает правильное значение для всех типов.

Вы не можете полагаться на какую-либо специфическую реализацию STL, чтобы использовать ее, хотя, если поставщик компилятора предоставил ее, то, вероятно, она содержит различные специфичные для компилятораулучшения за кулисами.

C ++ 11 std::is_trivial просто стандартизирует эту функцию, для реализации нет причин не использовать ее.

...