问题
According to C11 N1570 standard draft:
7.24.2.2 "The memmove function":
The
memmovefunction copiesncharacters from the object pointed to bys2into the object pointed to bys1. Copying takes place as if thencharacters from the object pointed to bys2are first copied into a temporary array ofncharacters that does not overlap the objects pointed to bys1ands2, and then thencharacters from the temporary array are copied into the object pointed to bys1
So if I choose to move a buffer of size 32K using (file_size = 32K)
memmove(io_Buffer, io_Buffer+17, file_size);
won't the temp buffer be of size 32K?
Question
Can the program allocate dynamic memory on its own? Does it allocate and free the memory in that one line?
回答1:
I think you missed the "as if" in that sentence. That means the effects will be the same as if it did that, not that it will actually do that. I've never seen an implementation of memmove that actually uses a temporary array.
回答2:
The memmove is not a single implementation in modern compilers; it is considered an intrinsic instead. It is easiest to show with an example how the "as if" works:
#include <string.h>
void test_memmove(void * restrict dst, const void * restrict src, size_t n) {
memmove(dst, src, n);
}
the restrict in parameters tell that the memory accessed through the pointers do not overlap. So GCC knows to compile this to
test_memmove:
jmp memcpy
Because the compiler was able to take the restrict into account and "prove" that the memory areas pointed to by these 2 do not overlap, the call to memmove was immediately changed to a (tail) call to memcpy!
来源:https://stackoverflow.com/questions/55370165/does-memmove-use-dynamic-memory-for-its-temporary-array