std::is_trival<T>::value
可以确定类 T 是否微不足道。但是,我想不出需要这些信息的场景。
有没有例子?
我的一些想法:
如果类 T 是微不足道的,这是否意味着 T 可以memcpy
像这样安全地复制:
T t1, t2;
memcpy(&t1, &t2, sizeof(T));
?
std::is_trival<T>::value
可以确定类 T 是否微不足道。但是,我想不出需要这些信息的场景。
有没有例子?
我的一些想法:
如果类 T 是微不足道的,这是否意味着 T 可以memcpy
像这样安全地复制:
T t1, t2;
memcpy(&t1, &t2, sizeof(T));
?
如果一个类型是平凡的,例如,它可以用memcpy
. 这是用作std::atomic
模板参数的用户定义类型的要求。也就是说,对于用户定义的类型T
,atomic<T>
允许(并且对于较大的类型,需要)实现从类型对象到类型对象T
的atomic<T>
赋值memcpy
。同样,在需要时测试相等性是用memcmp
.
使用这些 C 函数而不是 C++ 运算符的原因是原子操作不会对用户代码进行任何调用。这样做可能会导致看似无辜的代码出现神秘的死锁。
真的,普通类型对 /anything/ 很有用,它只需要一个字符指针和一个长度。Pete Becker 的回答描述了一个重要的案例,但这里有些愚蠢:您可以使用 序列化一个普通类型std::ostream::write
,然后使用 读取它std::istream::read
。
template<typename T>
std::enable_if<std::is_trivial<T>, void>
bin_write(std::ostream& out, const T& data) {
out.write(reinterpret_cast<const char*>(&data), sizeof(T));
}
template<typename T>
std::enable_if<std::is_trivial<T>::value, T>
bin_read(std::istream& in) {
using T_in = std::remove_cv_t<T>; //even if T is const, the buffer can't be
T_ buffer;
in.read(reinterpret_cast<char*>(&buffer), sizeof(T_));
return buffer;
}
显然,您不能在原始指针(或原始指针包装器,例如std::experimental::observer_ptr
)上使用它。这会忽略字节顺序,因此您可能不想将此数据发送到其他计算机上的其他应用程序。但是,如果您想编写模拟重新启动文件,或者如果您需要在 GCC 编译的 C++ 和 GCC 编译的 Fortran 之间传输数据,它会很有用。