2

std::is_trival<T>::value可以确定类 T 是否微不足道。但是,我想不出需要这些信息的场景。

有没有例子?

我的一些想法:

如果类 T 是微不足道的,这是否意味着 T 可以memcpy像这样安全地复制:

T t1, t2;
memcpy(&t1, &t2, sizeof(T));

?

4

2 回答 2

6

如果一个类型是平凡的,例如,它可以用memcpy. 这是用作std::atomic模板参数的用户定义类型的要求。也就是说,对于用户定义的类型Tatomic<T>允许(并且对于较大的类型,需要)实现从类型对象到类型对象Tatomic<T>赋值memcpy。同样,在需要时测试相等性是用memcmp.

使用这些 C 函数而不是 C++ 运算符的原因是原子操作不会对用户代码进行任何调用。这样做可能会导致看似无辜的代码出现神秘的死锁。

于 2013-02-20T16:58:31.937 回答
0

真的,普通类型对 /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 之间传输数据,它会很有用。

于 2018-04-10T12:30:38.720 回答