Когда я делаю простые под-классы, мне кажется, что мне приходится выбирать между безопасностью и производительностью.Это происходит в результате этого 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 оптимизировать копирование?
Примечания: