当前位置: 首页 > news >正文

c进阶篇(四):内存函数

内存函数以字节为单位更改

1.memcpy

memcpy 是 C/C++ 中的一个标准库函数,用于内存拷贝操作。它的原型通常定义在 <cstring> 头文件中,其作用是将一块内存中的数据复制到另一块内存中。

函数原型:void *memcpy(void *dest, const void *src, size_t n);

在 C++ 中,memcpy 函数也可以直接使用,但推荐使用类型安全的 std::memcpy,原型也在 <cstring> 头文件中声明:void* memcpy(void* dest, const void* src, size_t n);

参数解释

  • dest:目标内存的起始地址,即要将数据复制到的位置。

  • src:源内存的起始地址,即要从哪里复制数据。

  • n:要复制的字节数。

功能

memcpy 函数的作用是将 src 指向的内存区域的前 n 个字节复制到 dest 指向的内存区域。这意味着它能够高效地复制大块内存数据,常用于数组和结构体等数据结构的复制操作。

使用示例:

模拟实现:

void * memcpy ( void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}

注意事项

  • memcpy 不会检查内存的边界,因此在使用时要确保 dest 和 src 指向的内存区域不会发生重叠,否则结果将是不确定的。要处理可能重叠的情况,可以使用 memmove 函数。
  • 在 C++ 中,使用 std::memcpy 可以更好地与命名空间和重载机制配合,避免潜在的命名冲突。

2.memmove

在 C 语言中,memmove 的原型如下:void *memmove(void *dest, const void *src, size_t n);

在 C++ 中,memmove 函数同样可以直接使用,也推荐使用 std::memmove,其原型在 <cstring> 头文件中声明:void* memmove(void* dest, const void* src, size_t n);

参数解释

  • dest:目标内存的起始地址,即要将数据复制到的位置。

  • src:源内存的起始地址,即要从哪里复制数据。

  • n:要复制的字节数。

功能

memmove 函数与 memcpy 类似,都是将 src 指向的内存区域的前 n 个字节复制到 dest 指向的内存区域。不同的是,memmove 能够正确处理 destsrc 指向的内存区域有重叠的情况。具体来说,memmove 保证复制的结果是正确的,无论 srcdest 是否有重叠部分。

使用示例:

模拟实现:

void * memmove ( void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)) {while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else {dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return(ret);
}

注意事项

  • memmove 比 memcpy 的实现可能会稍慢,因为它必须确保在处理重叠的情况下也能正确复制数据。
  • 如果确定 src 和 dest 不会重叠,使用 memcpy 可能更为高效。
http://www.lryc.cn/news/391837.html

相关文章:

  • 新手入门:无服务器函数和FaaS简介
  • 基于Transformer的端到端的目标检测 | 读论文
  • 6.8应用进程跨网络通信
  • redis布隆过滤器原理及应用场景
  • vue+openlayers之几何图形交互绘制基础与实践
  • 「多模态大模型」解读 | 突破单一文本模态局限
  • Redis深度解析:核心数据类型与键操作全攻略
  • C语言 指针和数组——指针的算术运算
  • [C++][CMake][CMake基础]详细讲解
  • CCD技术指标
  • SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存
  • 【算法】(C语言):冒泡排序、选择排序、插入排序
  • iOS项目怎样进行二进制重排
  • CentOS中使用SSH远程登录
  • spring @Autowire注解作用
  • 密码学原理精解【5】
  • Unity3D 资源管理YooAsset原理分析与详解
  • npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
  • 浙大版PTA《Python 程序设计》题目集 参考答案
  • “拆分盘投资:机遇与风险并存
  • Java面试题系列 - 第2天
  • AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!
  • QT+OpenCV在Android上实现人脸实时检测与目标检测
  • 常见网络攻击方式及防御方法
  • 使用 ESP32 实现无线对讲机功能涉及音频采集、音频传输以及音频播放等多个方面。实现无线对讲机功能的基本步骤和示例代码。
  • SpringBoot项目,配置文件pom.xml的结构解析
  • 教程:Spring Boot中集成Memcached的详细步骤
  • Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现
  • 实验一 MATLAB \ Python数字图像处理初步
  • echarts柱状选中shadow阴影背景宽度设置