memmove是否将动态内存用于其临时数组

时间:2019-03-27 05:08:06

标签: c memory

根据C11 N1570 standard draft

7.24.2.2“ memmove函数”:

  

memmove函数将n指向的对象中的s2个字符复制到s1指向的对象中。 进行复制,就像首先将n所指向的对象中的s2个字符复制到n个字符的临时数组中一样 s1s2指向的对象,然后将临时数组中的n个字符复制到s1指向的对象

因此,如果我选择使用(file_size = 32K)移动大小为32K的缓冲区

memmove(io_Buffer, io_Buffer+17, file_size);

临时缓冲区的大小不是32K吗?

问题

程序可以自行分配动态内存吗?它会在那一行中分配和释放内存吗?

2 个答案:

答案 0 :(得分:6)

我认为您错过了该句子中的“好像”。这意味着效果将与执行此操作相同,而不是实际上执行该操作。我从未见过实际使用临时数组的memmove实现。

答案 1 :(得分:1)

memmove在现代编译器中不是一个单一的实现;它被认为是内在的。用示例最简单地显示“好像” 的工作方式:

#include <string.h>

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

参数restrict表示通过指针访问的内存不重叠。因此,海湾合作委员会knows to compile this to

test_memmove:
        jmp     memcpy

由于编译器能够考虑restrict并“证明”这2个指向的内存区域不重叠,因此对memmove的调用立即更改为(tail )致电memcpy