首页 > 系统相关 >memmove函数:内存重叠时拷贝

memmove函数:内存重叠时拷贝

时间:2024-12-26 11:21:51浏览次数:3  
标签:21 memmove 36 arraycopy 内存 拷贝 memcpy

最近测试遇到一个memcpy在x86和arm平台上拷贝字节时不一致的问题。出现拷贝是memcpy函数少量字节拷贝错误。

分析

参考:https://blog.csdn.net/shuidaoqingyi520/article/details/131669163
在内存有重合的时候memcpy是不稳定的,要使用memmove函数。我于是自己写了个简单代码对比

#include <stdio.h>
#include <string.h>

#define uint8_t unsigned char

int main() 
{
	// 初始赋值
    uint8_t In[36]={
        1,      2,      3,      4,      5,      6,
        7,      8,      9,      10,     11,     12,
        13,     14,     15,     16,     17,     18,
        19,     20,     21,     22,     23,     24,
        25,     26,     27,     28,     29,     30,
        31,     32,     33,     34,     35,     36
     }; 

    /*for(int i=0; i<36; i++){
        In[i] = i+1;
        printf("%u,",In[i]);
    }*/

    printf("\n src array:\n");
    for(int i=0; i<35; i++){
        printf("%u,",(In+1)[i]);
    }

    // 测试1
    memmove(In, In+1, sizeof(uint8_t)*20);

    // 测试2
    // memcpy(In, In+1, sizeof(uint8_t)*20);
	
	// 测试3
	// uint8_t tmp[36]={0};
    // memcpy(tmp, In+1, sizeof(uint8_t)*20);
    // memcpy(In, tmp, sizeof(uint8_t)*20);

    printf("\n dst array:\n");
    for(int i=0; i<36; i++){
      printf("%u,",In[i]);
    }
    printf("\n");
    return 0;
}

测试结果

不过根据测试结果来看,简单的程序memcpy和memmove还是一样的。

情况1:memmove

# gcc arraycopy.c -o arraycopy
# ./arraycopy
 src array:
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,
 dst array:
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,

标签:21,memmove,36,arraycopy,内存,拷贝,memcpy
From: https://www.cnblogs.com/liqinglucky/p/18632299/memmove

相关文章

  • JavaScript中的数组和函数在内存分别是如何存储的?
    在JavaScript中,数组和函数在内存中的存储方式涉及到JavaScript的内存管理机制,特别是堆(Heap)和栈(Stack)的使用。虽然这些概念在底层实现上可能因JavaScript引擎(如V8,SpiderMonkey等)的不同而有所差异,但我们可以从一个高层次的视角来理解它们。1.数组在内存中的存储数组在JavaScript......
  • Go 高级编程 三 内存模型
    内存模型并发编程模型:多线程、消息传递。从理论上来说,多线程和基于消息的并发编程是等价的。go语言是基于消息并发模块的编程语言,将基于CSP模型的并发编程内置到语言中,可以通过go关键字来启动一个goroutinego的goroutiune之间是共享内存的。Goroutinegoroutiune是一种轻量级......
  • 避坑指南:可能会导致.NET内存泄露的8种行为
    任何有经验的.NET开发人员都知道,即使.NET应用程序具有垃圾回收器,内存泄漏始终会发生。并不是说垃圾回收器有bug,而是我们有多种方法可以(轻松地)导致托管语言的内存泄漏。内存泄漏是一个偷偷摸摸的坏家伙。很长时间以来,它们很容易被忽视,而它们也会慢慢破坏应用程序。随着内存泄漏,你......
  • python多进程,通过内存共享来通信,使用进程锁来防止数据问题
    代码:importmultiprocessingimporttime'''使用锁和multiprocessing.Value,multiprocessing.Array,multiprocessing.Manager().list'''defworker1(shared_number1,lock):for_inrange(10):withlock:......
  • spark内存配置,你一定不能忽略的知识点
    前言Spark是一个强大的分布式计算框架,它可以处理大规模数据集,并通过内存缓存来提高计算性能。但如果不正确地配置Spark的内存,可能会导致缓存滥用和性能问题。本文将介绍如何有效地配置Spark的内存设置,以避免缓存滥用和提高性能。一、Spark内存配置在Spark中,内存主要用于两个......
  • 图解Linux下C内存分配 by using gpt
    我们可以通过GPT来详细地图解Linux上的C内存分配。这个过程可以进一步细化,只要你愿意。最小的C代码示例以下代码使用了标准C库函数malloc分配一块内存:#include<stdlib.h>#include<stdio.h>intmain(){int*ptr=(int*)malloc(sizeof(int)*10);//分配10......
  • MySQL占用内存和SWAP问题解决
    背景发现公司的项目部署上,经常出现数据库占用内存很高(接近6G)的情况,而且还出现了SWAP使用到90%左右的水平。所以需要排查数据库使用内存的情况,看数据库为什么使用了这么多内存,而且会不会频繁使用交换空间。要解决的问题:数据库使用高内存数据库使用SWAP解决SWAP空间在......
  • 《 C++ 点滴漫谈: 十二 》让内存飞一会儿:C++ Union 的神奇魔法
    摘要C++中的union关键字是一种独特的内存共享机制,通过允许多个成员共享同一段内存,提供了高效的存储方式和灵活的操作手段。本博客深入探讨了union的基础概念、成员规则、构造函数与析构函数的使用,以及现代C++提供的新特性支持。同时,我们分析了union的典型应用场景......
  • IDEA中项目增加断点,在调试过程中,断点暂停, VisualVM 中监控的线程会增加内存占用
    IDEA中项目增加断点,VisualVM中监控的线程会增加内存占用在IntelliJIDEA中为项目增加断点并进行调试时,VisualVM监控到的线程内存占用增加可能是由以下几个因素引起的:调试器附加:当你启动调试会话时,IDEA的调试器会附加到你的应用程序进程上。这可能会增加一些额外的内存......
  • 【Java基础面试题041】Java中的深拷贝和浅拷贝有什么区别?
    回答重点深拷贝:深拷贝不仅复制对象本身,还递归复制对象中所有引用的对象。这样新对象与原对象完全独立,修改新对象不会影响到原对象。即包括基本类型和引用类型,堆内的引用对象也会复制一份浅拷贝:浅拷贝只复制对象的引用,而不复制引用指向的实际对象,也就是说,浅拷贝创建一个新对象......