在什么情况下,我们需要知道,如果一个类是微不足道的?(In what cases do we nee

2019-08-17 02:13发布

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

是否有任何的例子吗?

我的一些想法:

假如T类是微不足道的,这是否意味着T能够被安全地复制memcpy这样的:

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

Answer 1:

如果一个类型是微不足道它可以,例如,与复制memcpy 。 这对被用来作为参数传递给用户定义类型要求std::atomic模板。 也就是说,对于一个用户定义类型Tatomic<T>被允许(并且,对于较大的类型,所需的)来实现从类型的对象分配T到类型的对象atomic<T>memcpy 。 同样,测试平等,在需要时,与做memcmp

之所以使用的不是C ++运算符这些C函数就是让原子操作不要拨打任何电话到用户代码。 这样做可能导致无辜的前瞻性神秘代码死锁。



Answer 2:

真的,琐碎的类型与/什么/它只是需要一个字符指针和长度是有用的。 皮特贝克尔的答案介绍重要案例,但这里有一些愚蠢的:你可以使用序列化一个简单类型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之间的数据。



文章来源: In what cases do we need to know if a class is trivial?