Как использовать и когда хорошо использовать memmove в C?
У меня есть два сомнения по поводу использования memmove языка():
- когда предпочтительнее использовать эту функцию вместо использования другой функции (т. е. созданной собственной функции)? Я не уверен, что правильно понял.
- подпись функции недействительным *memmove языка(недействительными *дест, ничтоже константные *в src, size_t в Н). Если у меня есть простой массив arr[N], как я могу поместить его в вызываемую функцию? arr[N] или &arr[N]? Разница является ли массив объявленным с начальным размером или как указатель? У меня есть это сомнение, потому что я видел много примеров, где используется оба.
надеюсь, я объяснил свои сомнения в хорошем смысле.
edit: я должен удалить элемент из массива, а затем я хочу переместить следующие элементы удаленного слева.
3 ответов
-
memmove
может быть быстрее, но, вероятно, никогда не будет медленнее, чем ваша собственная функция для копирования данных (обычно она кодируется в тщательно обработанной сборке, чтобы перемещать материал наиболее эффективным способом в текущей архитектуре); - это зависит от того, что вы хотите делать с этим массивом... если вы хотите скопировать его содержимое в другой массив
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
?