进行简单的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优化复制吗?
注释:
答案 0 :(得分:3)
在您的情况下,这不是必需的。 TriviallyCopyable足以存储一个对象,并且不需要琐碎的默认构造即可。这似乎只是一个过度热心的C ++实现。