在什么情况下我们需要知道一个班级是否微不足道?

时间:2013-02-20 16:26:02

标签: c++ class c++11 typetraits

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

有没有例子?

我的一些想法:

如果T类很简单,是否意味着可以memcpy安全地复制T,如下所示:

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

2 个答案:

答案 0 :(得分:6)

如果类型很简单,例如可以使用memcpy进行复制。这是用作用户定义类型的要求,用作std::atomic模板的参数。也就是说,对于用户定义的类型T,允许atomic<T>(对于需要更大的类型),实现从类型T的对象到类型{的对象的赋值{1}} atomic<T>。同样,在需要时,使用memcpy进行相等性测试。

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

答案 1 :(得分:0)

实际上,普通的类型对/ something /有用,只需要一个字符指针和一个长度。 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之间传输数据,它会很有用。