用于memcpy的类型安全C 包装器
Type-Safe C++ wrapper for memcpy?
鉴于std::copy
(显然对于琐碎类型)只能作为MEMMOVE周围的包装器实现(*),我想知道:
- 您需要
memcpy
时有标准的C 类型安全包装器吗?(我无法计算我忘记乘以sizeof
的次数。) - 如果标准中没有任何建议,对此有任何建议吗?如果不是,为什么不呢?
- 提供
memcpy
乘法的CC_4包装器有什么特定的障碍?
(*):C 标准库实现(从Back MSVC 2005(!)到Modern MSVC2015,libc 等)衰减std::copy
可腾出的类型到memmove
。bot 不是 to memcpy
。因为:
-
std::copy(src_first, src_last, destination_first)
定义了:如果
d_first
在[first, last)
范围内,则行为是不确定的。- 只有目标范围的开始不得在源范围内。允许目标范围延伸到源范围。也就是说,
d_first
可以是源范围的"左侧",目标范围可以扩展到源范围。
- 只有目标范围的开始不得在源范围内。允许目标范围延伸到源范围。也就是说,
-
std::memcpy
的定义是如果对象重叠,则行为是不确定的。
- 也就是说,完整的范围不得重叠:这就是使Memcpy成为最快变体的原因,因为它可以假设源和目标的内存完全不相交。
-
对于
std::memmove
,定义为:对象可能重叠:复制发生,好像字符被复制到临时字符数组,然后将字符从数组复制到dest。
。- 也就是说,来源和目标范围可能任意重叠,没有限制。
给出了这一点,很明显,您可以使用std::memove
来实现std::copy
用于琐事类型,因为MEMMOVE不会施加任何限制,并且可以通过类型特征在编译时完成对正确实现的派遣 -
但是,很难以memcpy
来实现std::copy
无关的内存范围可能很混乱。
所以,这使我们有
void* memcpy( void* dest, const void* src, std::size_t count );
一个函数少于恒星接口,在其中您不断地需要将非char对象的输入计数与其sizeof
相乘,并且完全没有构图。
但是,memcpy是最快的(并且要有很大的边距,请自己进行测量),当您需要快速的琐碎类型的快速副本时,您就可以找到memcpy。表面上应该易于包装在类型的安全包装中,例如:
template<typename T>
T* trivial_copy(T* dest, T* src, std::size_t n) {
return static_cast<T*>(std::memcpy(dest, src, sizeof(T) * n));
}
但是,不清楚您应该通过std::is_trival
或各种各样的时间进行编译时间检查,当然可能会讨论是否使用确切的memcpy
签名顺序,Yadda Yadda。
那么,我真的必须自己重新发明这条轮子吗?是为标准讨论的吗?等。
根据文档的说明memmove可以将内存复制到与源内存重叠的位置,对于memcpy,这是未定义的行为。
" 对象可能会重叠:复制发生,好像字符被复制到临时字符数组,然后将字符从数组复制到dest。
您需要Memcpy时有标准的C 类型安全包装器吗?(我无法计算我忘记乘以大小的次数。)
是,std ::复制(也许在下面解释)
如果标准中没有任何建议,对此有任何建议吗?如果不是,为什么不呢?
据我所知,标准并未强制使用sTD ::副本的memmove/memcpy使用。因此,这是实施的。例如,在Visual Studio Update 2015 Update 2中,他们确实使用MemMove加快了速度:
" 提高了std :: vector Realocation和std :: copy()的速度;当他们调用MemMove())时,它们的速度更快到9倍(包括用户定义类型)(包括用户定义的类型)。"
提供一个自动乘法大小的记忆包装器有什么特定的障碍?
不,实际上,您可以使用std :: is_trivial
自己实现此功能编辑:
根据本文档第25.3.1节,对STD没有限制::复制实现仅复杂性:
复杂性:最后 - 首次分配。
当您考虑Memcpy使用CPU特定指令(所有CPU上的CPU)来加快内存副本时,这是非常有道理的。
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 附加类型安全的子类std::string
- 什么是 c/c++ 中的类型安全
- 如何在 C++ 中正确包装类型
- 在模板类中使用'new'类型安全吗?
- 类型安全可变参数函数
- 类型安全 - all_of/ any_of/ none_of for std::tuple
- 如何在具有模板函数的类中使用类型安全的联合(变体)
- 将自动类型变量初始化为零.这种类型安全吗?
- 在 C++ 中强制实施类型安全,而无需使用额外的类
- 用于memcpy的类型安全C 包装器
- 以更健壮和类型安全的方式处理ASCII命令
- 是否有任何类型安全的、编译时检查的 printf 的实现
- 如何在C++中使类型安全字符串"definition"对象?
- 包装类型的铸造
- 以最新的C 的类型安全方式从枚举中随机选择元素
- 新的类型安全枚举是否定义为从 0 开始
- C++(类似SBT)的类型安全构建系统
- 初始值设定项列表引用类型安全
- 类型安全的c++11枚举类标志的模板