memcpy 函数
一、概述
memcpy 函数是 C 语言标准库中的一个函数,用于将指定长度的数据从源地址复制到目标地址。它的原型定义在 string.h 头文件中,函数名为 memcpy。
二、函数原型
void *memcpy(void *dest, const void *src, size_t n);
三、参数说明
1. dest:目标地址,即要将数据复制到哪里。
2. src:源地址,即要从哪里复制数据。
3. n:要复制的字节数。
四、返回值
返回指向目标地址的指针 dest。
五、函数实现
1. 普通实现
普通实现是最简单直接的方式,可以通过循环逐个字节地复制数据。这种方法比较慢,但适用于任何类型的数据。
```
void *memcpy(void *dest, const void *src, size_t n)
{
    char *d = (char *)dest;
    const char *s = (const char *)src;
    for (size_t i = 0; i < n; i++)
printf函数原型在什么头文件里
        d[i] = s[i];
    return dest;
}
```
2. 优化实现
优化实现可以根据不同的数据类型和 CPU 架构选择不同的方式来进行优化。例如,在 x86 架构上可以使用 SSE 指令集来加速内存拷贝操作。这种方法比较快,但需要针对不同情况进行优化。
```
#if defined(__GNUC__) && defined(__i386__)
#define HAVE_FAST_MEMCPY 1
#endif
#if HAVE_FAST_MEMCPY
#include <xmmintrin.h>
void *memcpy(void *dest, const void *src, size_t n)
{
    char *d = (char *)dest;
    const char *s = (const char *)src;
    if (n >= 64) {
        __m128i xmm0, xmm1, xmm2, xmm3;
        while ((uintptr_t)d & 15) {
            *d++ = *s++;
            n--;
        }
        while (n >= 64) {
            xmm0 = _mm_loadu_si128((__m128i *)(s + 0));
            xmm1 = _mm_loadu_si128((__m128i *)(s + 16));
            xmm2 = _mm_loadu_si128((__m128i *)(s + 32));
            xmm3 = _mm_loadu_si128((__m128i *)(s + 48));
            s += 64;
            _mm_stream_si128((__m128i *)(d + 0), xmm0);
            _mm_stream_si128((__m128i *)(d + 16), xmm1);
            _mm_stream_si128((__m128i *)(d + 32), xmm2);
            _mm_stream_si128((__m128i *)(d + 48), xmm3);
            d += 64;
            n -= 64;
        }
    }
    while (n--)
        *d++ = *s++;
    return dest;
}
#endif
```
六、使用示例
```
#include <stdio.h>
#include <string.h>
int main()