【发布时间】:2015-07-17 18:44:14
【问题描述】:
随着 c++11 的引入,trivially copyableness 变得非常重要。最值得注意的是'std::atomic'的使用。基础非常简单。如果满足以下条件,则 foo 类可以轻松复制:
foo* src = new foo();
foo* dest = malloc(sizeof(foo));
memcpy(dest, src, sizeof(foo));
与以下效果相同:
foo* src = new foo();
foo* dest = new foo(src);
因此,复制内存的对象将具有与复制构造函数相同的效果。但是,当然,这是一个问题。不仅有复制构造函数。但也要移动构造函数,移动赋值运算符。等等。
std::is_trivially_copyable 可以用来测试一个对象是否是普通可复制的。因此,通过反复试验,可以使对象易于复制。
当然,一套定义明确的规则会更好一些:)。所以特此提出我的要求。
【问题讨论】:
-
您的两个 sn-ps 具有不同的效果,因为一个构造对象而另一个不构造对象。标准库的容器仅在类型为平凡(平凡可复制 + 平凡可构造)时才使用 memcpy 进行复制构造。当类型只能简单地复制时,复制构造函数用于未初始化的范围,而 memcpy 用于已构造的范围。某些操作确实使用了两者,例如 std::vector 的赋值。