在C中实现C++标准11的std::move函数

An std::move function of C++ standard 11 implementation in C

本文关键字:std move 函数 标准 实现 C++      更新时间:2023-10-16

我们都知道在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中,您必须坚持通过指针来移动数据。