Использует ли memmove динамическую память для своего временного массива - PullRequest
2 голосов
/ 27 марта 2019

Согласно стандарту C11 N1570 :

7.24.2.2 «Функция memmove»:

Функция memmove копирует n символы из объекта, на который указывает s2, в объект, на который указывает s1. Копирование происходит так, как если бы символы n объекта, на который указывает s2, сначала копируются во временный массив из n символов , который не перекрывает объекты, на которые указывает s1, иs2, а затем n символов из временного массива копируются в объект, на который указывает s1

Так что, если я решу переместить буфер размером 32K, используя (file_size =32K)

memmove(io_Buffer, io_Buffer+17, file_size);

не будет ли временный буфер размером 32K?

Вопрос

Может ли программа выделять динамическую память самостоятельно?Распределяет ли это и освобождает ли память в этой строке?

Ответы [ 2 ]

6 голосов
/ 27 марта 2019

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

1 голос
/ 27 марта 2019

memmove - не единственная реализация в современных компиляторах; вместо этого он считается внутренним. Проще всего показать на примере, как работает «как будто» :

#include <string.h>

void test_memmove(void * restrict dst, const void * restrict src, size_t n) {
    memmove(dst, src, n);
}

параметры restrict говорят о том, что память, доступ к которой осуществляется через указатели, не перекрывается. Так что GCC знает, как скомпилировать это в

test_memmove:
        jmp     memcpy

Поскольку компилятор смог учесть restrict и «доказать», что области памяти, на которые указывают эти 2, не перекрываются, вызов memmove был немедленно изменен на (хвостовой) вызов memcpy!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...