2016-03-03 4 views
0

Мне нужно переместить содержимое байтового буфера. Естественно, я начал писать memcpy, но потом понял, что может быть спецификатор restrict для источника и dest. Моя реализация (MSVC 2013), похоже, не имеет этого. Cppreference перечисляет две версии memcpy с и без restrict, но я не понимаю - я не думаю, что это перегрузки, и мне непонятно, как компилятор мог правильно определить, какой из них выбрать. С другой стороны, функция memcpy может анализировать адреса и аргумент count во время выполнения, чтобы определить, перекрываются ли диапазоны адресов или нет.Разрешено ли совпадение аргументов src и dest memcpy?

Итак, разрешено ли звонить memcpy с перекрывающимися аргументами? Если нет, есть ли способ выполнить эту операцию, которая лучше, чем обычная for?

+2

Документация 'memcpy' довольно явная, не так ли? –

ответ

5

No it is not, вы должны использовать memmove.

От memcpy(3):

В тетсру) функция копирует п байт из области памяти SRC в области памяти Dest (. Области памяти не должны перекрываться. Используйте memmove (3), если области памяти перекрываются.

От memmove(3):

В memmove) функция копирует п байт из области памяти SRC в области памяти Dest (. Области памяти могут перекрываться: копирование происходит так, как будто байты в src сначала копируются во временный массив, который не перекрывает src или dest, а затем байты копируются из временного массива в dest.

restrict ключевое слово добавлено в стандарте C99, именно поэтому cppreference списки обе версии (если вы внимательно посмотрите на право, вы можете увидеть until C99 и since C99).

1

Память в memcpy не может перекрываться, или вы рискуете неопределенным поведением.

Используйте memmove вместо этого.

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

  • Нет связанных вопросов^_^