Можно ли сделать инициализированный по умолчанию класс std :: is_trivial для повышения производительности? - PullRequest
0 голосов
/ 28 ноября 2018

Когда я делаю простые под-классы, мне кажется, что мне приходится выбирать между безопасностью и производительностью.Это происходит в результате этого std::is_trivial, который используется в STL, чтобы определить, можно ли скопировать класс с помощью memmove / memcpy или прибегнуть к циклу.

Следующий фрагмент демонстрируетРазница:

// A can be copied via memmove
struct A { int x; }; // x is left uninitialized
static_assert(std::is_trivial_v<A>);
static_assert(std::is_trivially_copyable_v<A>);
auto copy_a(A* first, A* last, A* dst) { std::copy(first, last, dst); }

// B is prevented to be copied via memmove
struct B { int x{}; }; // x is initialized
static_assert(!std::is_trivial_v<B>);
static_assert(std::is_trivially_copyable_v<B>); // true
auto copy_b(B* first, B* last, B* dst) { std::copy(first, last, dst); }

С моей точки зрения, кажется, что std :: copy хорошо бы использовать std::is_trivially_copyable<> вместо std::is_trivial, но я полагаю, что у std :: copy есть тонкие причиныиспользует std :: is_trivial.

Однако есть ли способ инициализировать класс по умолчанию, но все же позволить STL оптимизировать копирование?

Примечания:

  • GodBolt доступен на https://godbolt.org/z/6tejQj
  • Использование ручного использования std :: memcpy не является опцией

1 Ответ

0 голосов
/ 28 ноября 2018

Это не должно быть необходимым в ваших обстоятельствах.TriviallyCopyable достаточно, чтобы иметь возможность запоминать объект, и для него не требуется тривиальное конструирование по умолчанию.Похоже, это просто чрезмерная реализация C ++.

...