2015-11-20 2 views
0

Мы все знаем о мощной функциональности функции std :: move, которая реализована в стандарте C++ 11, где она перемещает элементы в определенном диапазоне в новый диапазон.Функция std :: move реализации стандарта C++ 11 в C

Я хотел бы знать, могу ли я разработать такую ​​функциональность в чистом C-коде. Мой код написан на C, и я хочу иметь что-то похожее на std :: move на C++, где я могу перемещать диапазон целочисленных элементов в новый диапазон без использования временного буфера.

+5

'std :: move' не перемещает ничего, это просто тип. – 101010

+1

Приведение к типу, который AFAIK не имеет аналогов в C. Без ссылок на r-значение будет трудно подражать семантике перемещения. – juanchopanza

+3

«move» - это то же самое, что и «copy» для целых чисел, поэтому просто скопируйте их –

ответ

6

Что касается текста:

... перемещает элементы в определенном диапазоне в новый диапазон.

и:

... где я могу переместить диапазон целых элементов в новый диапазон без использования временного буфера.

Я думаю, что вещь, за которой вы находитесь, является 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} 
+2

@skypjack, основанный на тексте, я верю моя интерпретация верна, а именно: «переместите диапазон целочисленных элементов в новый диапазон». – paxdiablo

2

Если вы посмотрите на возможное осуществление 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 его аргумент ввода для ссылки rvalue. Таким образом, нет «перемещения» от std::move.

Теперь механизм перемещения в C++ 11 и далее основан на ссылках rvalue. C не имеет даже простых ссылок. Следовательно, практически невозможно реализовать такой механизм на С, поскольку основные средства отсутствуют.

В C вам придется придерживаться перемещения данных через указатели.

Смежные вопросы