在C中实现C++标准11的std::move函数
An std::move function of C++ standard 11 implementation in C
我们都知道在C++标准11中实现的std::move函数的强大功能,它将特定范围内的元素移动到新的范围内。
我想知道我是否可以用纯C代码开发这样的功能。我的代码是用C编写的,我想要一些类似于C++的std::move函数的东西,在那里我可以在不使用临时缓冲区的情况下将整数元素的范围移动到一个新的范围。
关于您的文本:
将特定范围中的元素移动到新范围中。
和:
其中我可以在不使用临时缓冲区的情况下将整数元素的范围移动到新的范围中。
我想你想要的是memmove
。它类似于memcpy
,但可以毫无问题地处理重叠区域。
例如,以下代码将元素从范围3到6(从零开始)移动到范围2到5:
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[]) {
int xyzzy[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memmove (&(xyzzy[2]), &(xyzzy[3]), sizeof(*xyzzy) * 4);
printf ("{ %d", xyzzy[0]);
for (int i = 1; i < sizeof(xyzzy) / sizeof(*xyzzy); i++)
printf (", %d", xyzzy[i]);
printf (" }n");
return 0;
}
基本上是这样的:
{0 1 2 3 4 5 6 7 8 9}
| | | |
/ / / /
| | | |
V V V V
{0 1 3 4 5 6 6 7 8 9}
如果您查看std::move
:的可能实现
template <typename T>
typename remove_reference<T>::type&& move(T&& arg) {
return static_cast<typename remove_reference<T>::type&&>(arg);
}
您将看到std::move
所做的只是将其输入参数static_cast
转换为右值引用。因此,std::move
没有"移动"。
现在,C++11及更高版本中的移动机制是基于右值引用的。C甚至没有简单的引用。因此,由于缺乏基本设施,在C中几乎不可能实现这样的机制。
在C中,您必须坚持通过指针来移动数据。
相关文章:
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move 如何使原始变量的值无效?
- 复制elision、std::move和链式函数调用
- 如果真的需要std::move,我们应该什么时候声明右值refs
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?