是否可以将默认初始化的类std :: is_trivial用于性能目的

时间:2018-11-28 08:26:07

标签: c++ templates stl c++17

进行简单的Pod类时,似乎我必须在安全性和性能之间做出选择。这是由于std::is_trivial导致的,该memmove在STL中用于确定是否可以通过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::is_trivially_copyable<>

从我的角度来看,似乎仅使用std::is_trivial而不是My_string = My Awesome Company billing @ example . com Contractor Invoice # 000015 Acme Projects - Taxable Product Contractor Invoice Summary Account Information Don Test don @ example . com Contractor Invoice Date : 10 / 26 / 2016 Amount Due $ 21 . Desired_string = My Awesome Company billing@example.com Contractor Invoice#000015 Acme Projects-Taxable Product Contractor Invoice Summary Account Information Don Test don@example.com Contractor Invoice Date:10/26/2016 Amount Due$21. 就能很好地实现std :: copy,但是我认为存在std :: copy使用std ::的细微原因。 is_trivial。

但是,有什么方法可以使类默认初始化,但是仍然允许STL优化复制吗?

注释:

1 个答案:

答案 0 :(得分:3)

在您的情况下,这不是必需的。 TriviallyCopyable足以存储一个对象,并且不需要琐碎的默认构造即可。这似乎只是一个过度热心的C ++实现。