memmove() 定义中的重叠是什么
What is overlapping in memmove() definition?
我正在从关于memcpy
和memmove
的 c++ 参考中读取,他们似乎在做同样的事情,只是memmove
有一个特定的想法称为(允许目标和源重叠)。
什么是重叠,何时发生?
这很简单。 考虑memmove(dest, source, length)
.
如果范围指定的字节范围source
到source + length - 1
包括 dest
到 dest + length - 1
指定范围内的任何字节,则这两个范围重叠。
在数组中移动元素时最有可能发生这种情况。 例:
// Slide array down by one:
char array[N];
memmove( (void*) &array[0], (void*) &array[1], N - 1 );
这在元素 1 到 N-2 上重叠。 滑动另一个方向也有类似的重叠:
// Slide array up by one:
memmove( (void*) &array[1], (void*) &array[0], N - 1 );
如果要尝试使用 memcpy()
执行相同的操作,则生成的行为是未定义的。 如果在上面的两个示例中都使用 memcpy
,某些实现将正常工作。 如果您在此处使用memcpy
而不是memmove
,则其他两者中的一个或两个都将失败。 这是 C 和 C++ 在范围像这样重叠时未定义行为的结果 memcpy()
。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- memmove() 定义中的重叠是什么
- 在谈论重叠 I/O 时,上下文信息是什么意思