自己实现的memcpy

没有考虑目标和源地址可能重复的情况,不知道除了这个方法之外不用汇编等方式还有没有更快的方法?至少我目前是想不出来:)

void *my_memcpy(void *dst, void* src, int size)
{
    int len = sizeof(long);
    long *pdst = (long*)dst;
    long *psrc = (long*)src;

    for (; size >= len; ++pdst, ++psrc, size -= len)
    {
        *pdst = *psrc;
    }

    for (len = size, size = 0; size < len; ++size)
    {
        *((char*)pdst + size) = *((char*)psrc + size);
    }

    return dst;
}

int main()
{
    char src[] = "hello", dst[10] = {'\0'};

    my_memcpy(dst, src, 5);
    printf("dst = %s\n", dst);

    return 0;
}

时间: 2024-11-08 17:50:32

自己实现的memcpy的相关文章

比memcpy更快的内存拷贝

偶然间看到一个叫xmemcpy的工具,用做内存拷贝.号称在拷贝120字节以内时,比glibc提供的memcpy快10倍,并且有实验数据. 这让人感觉很诧异.一直以来都觉得memcpy是很高效的.相比于strcpy等函数的逐字节拷贝,memcpy是按照机器字长逐字进行拷贝的,一个字等于4(32位机)或8(64位机)个字节.CPU存取一个字节和存取一个字一样,都是在一条指令.一个内存周期内完成的.显然,按字拷贝效率更高. 那么,这个xmemcpy是靠什么来实现比memcpy"快10倍"的呢

提前认识软件开发(8) memset()与memcpy()函数

软件项目中的代码,少则数千行,多则上万行,但并非无规律可循.阅读了那么多代码之后,我发现有两个函数出现的频率很高,那就是memset()与memcpy()函数,它们都是C语言编程中经常要用到的.工作之余,我查了一些资料,现对它们作一个简单的说明. 1. memset()函数 (1)函数原型 void *memset( void *dest, int c, size_t count ). (2)函数作用 在MSDN中,将该函数的作用描述为:Sets buffers to a specified c

大并发服务器内存转换的灵活运用,memcpy的思考

在很多的网络开发中,经常会碰到一些内存转换,如下面的场景: #define PACKAGE_PARSE_ERROR -1 #define PACKAGE_PARSE_OK 0 int parse_package( int* a, int* b, int* c, int* d, char* buf, int buf_len ) { if( !buf || buf_len < 16 ){ return PACKAGE_PARSE_ERROR; } memcpy( a, buf, 4 ); memcp

memset,memcpy,strcpy 的区别

一.函数原型 strcpy extern char *strcpy(char *dest,char *src); #include <string.h> 功能:把src所指由NULL结束的字符串复制到dest所指的数组中 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针 memcpy extern void *memcpy(void *dest,void *src,unsigned int count); #include &

c++ memcpy的崩溃问题

问题描述 c++ memcpy的崩溃问题 程序有时候运行到memcpy会崩溃,但不是每次必崩溃的,代码如下: struVTRecord.firstPic.resize( pVtRecord->vtViewPicInfo[0].imgFrame.pImage->nSize ); memcpy( &struVTRecord.firstPic[0], pVtRecord->vtViewPicInfo[0].imgFrame.pImage->cImageData[0], pVtRe

[经典面试题]实现memcpy库函数

[题目] 已知memcpy的函数为: void* memcpy(void *dst , const void* src , size_t count) 其中dst是目的指针,src是源指针.不调用c++/c的memcpy库函数,请编写memcpy. -------百度,网新恒天校园招聘 [解析] 1 按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作, 即不能对void指针进行如p++的操作,所以需要转换为具体的类型指针

代码-比库函数memcpy更高效的实现

问题描述 比库函数memcpy更高效的实现 求一个比库函数memcpy更高效的内存拷贝函数显示,求代码!采纳的有积分奖励 解决方案 编译器已经对memcpy做了很多中优化了 VC 对 memcpy 的优化http://blog.codingnow.com/2005/10/vc_memcpy.html 解决方案二: 编译器已经考虑各种优化可能,以及兼容性,各种极端测试情况等. 你想做的比编译器更好,不是那么容易 解决方案三: 当然可以看看VC,GCC, CLang对memcpy的实现,会有一些区别

memcpy多字节字节赋值问题

   以前没注意过多字节赋值问题,考虑的角度是充分利用 cpu 的 32 位带宽.一次复制 1 个字节和一次复制 4 个字节占用的 cpu 指令周期是一样的,既然我们的 cpu 能同时操作 32 位,为什么我们不能一次复制 4 个字节呢?如此一来,总运行的指令数将降低到原来的 1/4 !   于是有下面代码(henix转自http://www.embedded.com/columns/technicalinsights/19205567?_requestid=212290): 1 void *m

memmove 和 memcpy的区别

memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count);  他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确. 第一种情

让你提前认识软件开发(8):memset()与memcpy()函数

第1部分 重新认识C语言 memset()与memcpy()函数           软件项目中的代码,少则数千行,多则上万行,但并非无规律可循.阅读了那么多代码之后,我发现有两个函数出现的频率很高,那就是memset()与memcpy()函数,它们都是C语言编程中经常要用到的.工作之余,我查了一些资料,现对它们作一个简单的说明.         1. memset()函数         (1)函数原型         void *memset( void *dest, int c, size