Как использовать и когда хорошо использовать memmove в C?

У меня есть два сомнения по поводу использования memmove языка():

  • когда предпочтительнее использовать эту функцию вместо использования другой функции (т. е. созданной собственной функции)? Я не уверен, что правильно понял.
  • подпись функции недействительным *memmove языка(недействительными *дест, ничтоже константные *в src, size_t в Н). Если у меня есть простой массив arr[N], как я могу поместить его в вызываемую функцию? arr[N] или &arr[N]? Разница является ли массив объявленным с начальным размером или как указатель? У меня есть это сомнение, потому что я видел много примеров, где используется оба.

надеюсь, я объяснил свои сомнения в хорошем смысле.

edit: я должен удалить элемент из массива, а затем я хочу переместить следующие элементы удаленного слева.

3 ответов


  1. memmove может быть быстрее, но, вероятно, никогда не будет медленнее, чем ваша собственная функция для копирования данных (обычно она кодируется в тщательно обработанной сборке, чтобы перемещать материал наиболее эффективным способом в текущей архитектуре);
  2. это зависит от того, что вы хотите делать с этим массивом... если вы хотите скопировать его содержимое в другой массив arr будет достаточно (и, как параметр длины, вы должны сделать sizeof(*arr)*N где N-количество элементов для копия.)

кстати, если источник и место назначения и копии неперекрывающиеся memcpy может быть быстрее.

я хочу удалить элемент из массива и сдвинуть влево элемент того же массива.

int arr[N];
/* ... */
/* Let's say you want to remove the element i (error checking on i omitted) */
memmove(arr+i, arr+i+1, (N-i-1)*sizeof(*arr));
/* or, if you prefer array indexing over pointer arithmetics: */
memmove(&arr[i], &arr[i+1], (N-i-1)*sizeof(*arr));

(sizeof(*arr) означает "получить размер элемента массива")


memmove как memcpy за исключением того, что целевой и исходный массив могут перекрываться.

С memcpy вы обещаете, что регионы не перекрываются, что позволяет реализации выполнять некоторые дополнительные оптимизации. Так что memcpy может быть быстрее, чем memmove.

на


когда предпочтительнее использовать эту функцию вместо использования другой функции (т. е. созданной собственной функции)

это быстрее, чем"созданная собственная функция".

сигнатура функции-это пустота *memmove языка(недействительными *дест, ничтоже константные *в src, size_t в Н). Если у меня есть простой массив arr[N], как я могу поместить его в вызываемую функцию? arr[N] или &arr [N]

просто arr?