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函数就是让原子操作不要拨打任何电话到用户代码。 这样做可能导致无辜的前瞻性神秘代码死锁。
真的,琐碎的类型与/什么/它只是需要一个字符指针和长度是有用的。 皮特贝克尔的答案介绍重要案例,但这里有一些愚蠢的:你可以使用序列化一个简单类型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之间的数据。