gpt4 book ai didi

c++ - 是否可以出于性能目的创建默认初始化的类 std::is_trivial

转载 作者:太空狗 更新时间:2023-10-29 21:10:35 27 4
gpt4 key购买 nike

在制作简单的pod-classes时,似乎我必须在安全和性能之间做出选择。发生这种情况是因为 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优化复制?

注释:

最佳答案

在您的情况下,这不是必需的。 TriviallyCopyable 足以能够 memcpy 一个对象,它不需要平凡的默认构造。这似乎只是一个过度热心的 C++ 实现。

关于c++ - 是否可以出于性能目的创建默认初始化的类 std::is_trivial,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53515062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com