Действительно ли memmove "перемещает" кусок памяти и оставляет после себя нули в источнике?

Возможный дубликат:
memcpy против memmove

Действительно ли memmove "перемещает" кусок памяти? Если так, то это оставляет память с нулями? Или это как memcpy? Я смотрю на справочную страницу и не верю, что мое предположение верно. Если я хочу переместить часть памяти, используя memmove, должен ли я вручную обнулить часть памяти, куда я сделал перемещение?

2 ответа

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

Обычно, если вам нужно memmoveПоказательно, что у вас есть серьезная фундаментальная неэффективность в вашем дизайне. Например, часто новые программисты на C пытаются использовать memmove удалить первые несколько символов строки (например, memmove(s, &s[1], len)) а не просто используя s+1 или же &s[1] обратиться к хвосту строки. Алгоритмы, содержащие memmove редко работают лучше, чем O(n^2).

Не совсем:

Основное различие между memmove а также memcpy в том, что memmove может использоваться для перемещения фрагмента памяти куда-то, что перекрывает блок памяти, который вы пытаетесь переместить. И, следовательно, оригинальный указатель больше не будет действительным.

С memcpyс другой стороны, две области не могут перекрываться.

memmove не обнуляет оригинальный блок памяти. Если вы хотите сделать это, вам придется явно сделать это самостоятельно с помощью memset. Как правило, подпрограммы C не тратят циклы, выполняя ненужные вещи, такие как обнуление памяти. Сравнить с malloc, который также не обнуляет блок памяти.

Другие вопросы по тегам