std::copy的限制是否比std::memcopy更宽松?
Are the restrictions of std::copy more relaxed than std::memcopy?
(顺便说一句,这里有很好的信息),我一直在阅读,在我看来,这与口语所说的不同,例如在 cppreference 注意:自从引用此报价以来,memcpy 已更改为 memmove。 --
笔记
在实践中,
std::copy
的实现避免了多个赋值 并使用大容量复制函数,例如std::memcpy
如果值类型为TriviallyCopyable
-- std::copy
(也不是std::copy_backward
)不能用memcopy
来实现,因为对于std::copy
,只有目标范围的开头不能落入源范围,但对于memcpy
,整个范围不能重叠。
看看 Visual-C++ 的实现(参见 xutility
标题),我们还可以观察到 VC++ 使用 memmove,但现在它的要求比 std::copy
更宽松:
。对象可能会重叠:复制就像字符一样进行 被复制到临时字符数组,然后字符 是从数组中复制的...
因此,从memcpy
方面实现std::copy
似乎是不可能的,但使用memmove
实际上是一种悲观。(有点悲观,可能无法衡量,但仍然如此)
回到问题:我的总结是否正确?这在任何地方都是问题吗?无论指定什么,是否有可能的实际实现memcpy
也不能满足std::copy
的要求,即当范围部分重叠时是否有memcpy
实现中断std::copy
允许?
如果问题是,是否有可能遇到一个高效的memcpy实现,具有足够的未定义行为,以至于在重叠范围内不信任它,那么答案是肯定的。
考虑 Power(PC) 架构上 memcpy 的一种可能实现:LMW 指令将多个连续的字从内存加载到连续寄存器中(可以指定为用户定义的范围参数)。 然后,STMW 会将提供的寄存器范围保存回内存。因此,我们谈论的是 CPU 在单次 memcpy 迭代期间缓冲的 ~100/200 字节 (32b/64b CPU) - 如果目标范围与源范围重叠,则大量数据会破坏目标范围,特别是考虑到 CPU 不承诺单个加载和存储的相对顺序。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 用memcopy、memmove或std:copy替换For循环
- std::copy的限制是否比std::memcopy更宽松?