memcpy不适用的场景

简介: memcpy不适用的场景

这是曾经碰到一个面试题,当时没回答上来。而且就是写这篇文档的现在,也不敢说掌握的资料就是面试官想要的答案。只能是比当时多一点理解,以供大家参考。

问题细节已记不太清,好像就是问memcpy在哪些时候,拷贝效率不高。

函数原型及描述

#include <string.h>
void *memcpy(void *restrict dst, const void *restrict src, size_t n);
DESCRIPTION
The memcpy() function copies n bytes from memory area src to memory area dst.  If dst and src overlap, behavior is undefined.  Applications in which dst and src might overlap should use memmove(3) instead.

如果要考虑源地址和目的地址有重叠的情况,可使用memmove

#include <string.h>
void *memmove(void *dst, const void *src, size_t len);
DESCRIPTION
The memmove() function copies len bytes from string src to string dst.  The two strings may overlap; the copy is always done in a non-destructive manner.

附上memcpy的glibc实现

void *memcpy (void *dstpp, const void *srcpp, size_t len)
{
    unsigned long int dstp = (long int) dstpp;
    unsigned long int srcp = (long int) srcpp;
    /* Copy from the beginning to the end.  */
    /* If there not too few bytes to copy, use word copy.  */
    if (len >= OP_T_THRES) //其中OP_T_THRES为16
    {
        /* Copy just a few bytes to make DSTP aligned.  */
        len -= (-dstp) % OPSIZ;
        BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);
        /* Copy whole pages from SRCP to DSTP by virtual address manipulation,
        as much as possible.  */
        PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);
        /* Copy from SRCP to DSTP taking advantage of the known alignment of
        DSTP.  Number of bytes remaining is put in the third argument,
        i.e. in LEN.  This number may vary from machine to machine.  */
        WORD_COPY_FWD (dstp, srcp, len, len);
        /* Fall out and copy the tail.  */
    }
    /* There are just a few bytes to copy.  Use byte memory operations.  */
    BYTE_COPY_FWD (dstp, srcp, len);
    return dstpp;
 }
  /* Copy exactly NBYTES bytes from SRC_BP to DST_BP,
     without any assumptions about alignment of the pointers.  */
#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes)     \
do                                          \
{                                         \
    size_t __nbytes = (nbytes);           \
    while (__nbytes > 0)                  \
    {                                     \
        byte __x = ((byte *) src_bp)[0];  \
        src_bp += 1;                      \
        __nbytes -= 1;                    \
        ((byte *) dst_bp)[0] = __x;       \
        dst_bp += 1;                      \
     }                                    \
} while (0)

这段代码表示,在数据量较少的拷贝,比如16个字节以内,也就是4个整形数据的长度,采用一个循环赋值的方式,逐字节的将源地址的数据赋值到目的地址上,且忽略字节对齐和重叠的情况。数据量较大的时候,会按页拷贝按字拷贝,当然这是根据PAGE_COPY_FWD_MAYBE函数和WORD_COPY_FWD函数推测的,这两个函数肯定会利用vector指令并行来优化。

那如果是小于16字节的拷贝,可以发现这个操作相当于是用一串宏定义去代替,宏定义是由预处理器展开,没有函数的参数压栈,减少调用开销,所以非常高效。

假如,我们知道拷贝的数据是固定长的字节,比如一个整数,4个字节,那么采用memcpy也是可以的,但是显然,不需要做那么多循环操作,分4次将整数数据拷过去。而且跨平台时遇到大小端的时候,可能会出现错误。

所以结论是memcpy不适用的场景:

  1. 源地址与目的地址有重叠的情况。不安全。
  2. 固定小字节数据的拷贝。效率低。
  3. 涉及到跨平台编程时的小字节数据的拷贝。不安全。

一个月后,当chatgpt开始流行,我将这个问题输入到chatgpt,得到了这个问题的"标准答案",事情变得简单了很多

从一次memcpy说开来

dpdk之memcpy优化

相关文章
|
存储 安全 网络协议
绕过WAF和多个防护软件提权案例
绕过WAF和多个防护软件提权案例
592 0
|
6月前
|
人工智能 自然语言处理 Python
大模型落地必看:如何用量化指标,给你的模型模型打个分?
本文分享大模型仿真评估的“全家桶”方案,从准确性、相关性、流畅性、合规性四大维度构建科学量化体系,结合自动化与人工评估实践,助力模型从实验室走向生产落地,告别“玄学调优”,实现精准验收与持续优化。(239字)
519 5
|
分布式计算 大数据 数据处理
从Excel到大数据:别让工具限制你的思维!
从Excel到大数据:别让工具限制你的思维!
689 85
|
机器学习/深度学习 负载均衡 C++
MoR vs MoE架构对比:更少参数、更快推理的大模型新选择
本文将深入分析递归混合(MoR)与专家混合(MoE)两种架构在大语言模型中的技术特性差异,探讨各自的适用场景和实现机制,并从架构设计、参数效率、推理性能等多个维度进行全面对比。
736 0
MoR vs MoE架构对比:更少参数、更快推理的大模型新选择
|
SQL 监控 安全
浅析Waf优缺点:硬件Waf、软件Waf、云Waf之总结
Web应用防火墙(WAF)是一种专门针对Web应用攻击的防护产品,主要分为硬件WAF、软件WAF和云WAF三种形态。硬件WAF部署简便、防护范围广,但价格昂贵且存在误杀风险;软件WAF开箱即用、功能丰富,但可能占用较多内存,适合中小型网站;云WAF部署简单、维护成本低,但存在被绕过和数据泄露的风险。RASP(运行时应用自保护)是一种新兴的安全技术,通过将保护程序注入应用程序,实现实时检测和阻断攻击,具有低误报率、维护成本低等优势,但也面临部署困难和可能影响性能的问题。未来,WAF防护技术将朝着机器学习、词法分析、行为识别和大数据关联分析等方向发展。
1724 6
|
人工智能 搜索推荐 大数据
【云故事探索】NO.11:福建紫讯——数字化转型的前行者
福建紫讯科技成立于2015年,致力于为跨境电商提供高效软件解决方案。通过整合大数据、云计算和AI,构建了完整的跨境电商生态系统。面对网络访问难题,紫讯优化了紫鸟浏览器,提升了用户体验,并借助阿里云的PAI框架,大幅降低了研发成本。未来,紫讯将继续深耕AI技术,提升卖家竞争力,并与阿里云深化合作,推动行业发展。
|
运维 监控 负载均衡
介绍一下微服务架构的优缺点
介绍一下微服务架构的优缺点
865 0
|
存储 网络协议 算法