`

【测速】memcpy()对比for循环逐个对象拷贝

    博客分类:
  • C++
 
阅读更多
结论:一般情况下,memcpy()函数比for循环快个一两倍,某些特殊值上稍微慢点儿。

注意:对于需要构造函数、析构函数的类,可能要在拷贝时重载=运算符,此时memcpy()的结果就不是自己想要的了,一般情况下还是老老实实用for循环吧

测试结果如下:









测试代码如下(不完全):
#include <string>
#include "..\Include\lc\utility\Timer.hpp"
#include <iostream>

using namespace LC;
void main() {
    typedef long long worktype;
    //typedef int worktype;

    for(int num=10; num<10000000; num*=5) {
        const int testNum=10000000/num*100;
        worktype* pDst=new worktype[num];
        worktype* pSrc=new worktype[num];

        Timer timer;
        for (int i=0; i<testNum; i++) {
            memcpy(pDst,pSrc,sizeof(worktype) * num	);
        }
        long tMemcpy=timer.getElapsedTimeAndRestart();

        for (int i=0; i<testNum; i++) {
            for (int n=0; n<num; n++) {
                pDst[n]=pSrc[n];
            }
        }
        long timeCopy=timer.getElapsedTimeAndRestart();

        std::cout<<"数组长度:"<<num<<";\t测试次数:"<<testNum<<";\tmemcpy: "<<tMemcpy<<"ms;\tfor循环: "<<timeCopy<<"ms"<<std::endl;
    }
}

  • 大小: 44.5 KB
  • 大小: 44.5 KB
  • 大小: 43.9 KB
  • 大小: 45.4 KB
分享到:
评论

相关推荐

    C语言中memcpy 函数的用法详解

    c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 void* memcpy(void* destination, const void* source, size_t num); void*...

    memcpy, memcpy()函数,字符串拷贝

    在标题“memcpy, memcpy()函数,字符串拷贝”以及描述“memcpy: 头文件,函数原型,函数功能,函数返回值,说明”中,主要讨论了`memcpy`函数的相关知识点。下面将详细介绍`memcpy`函数的关键特性及其应用场景。 ##...

    Keil下的一些内存拷贝

    内存拷贝通常在C语言中通过`memcpy()`函数实现,但在某些特定场合,为了追求性能优化或者解决特定硬件限制,可能需要使用汇编语言来手动实现。"汇编优化"标签表明我们讨论的是如何通过汇编代码来提升内存拷贝的速度...

    1. 拷贝构造与拷贝赋值1

    如示例中的深拷贝实现`Buz::Buz(const Buz &other)`,通过`new`关键字创建了一个新的`int`数组,并使用`memcpy`复制了原对象的数据。 拷贝构造函数是一种特殊的构造函数,它接受一个同类型的常量引用作为参数,用于...

    memcpy的用法

    memcpy 函数的实现原理是通过循环将 src 内存区域的字节一个一个地复制到 dest 内存区域中。下面是一个简单的实现: ```c void *memcpy1(void *dest, const void *src, size_t count) { if ((dest == NULL) && ...

    linux memcpy源码

    ### Linux memcpy 源代码分析 #### 一、概述 `memcpy`是C语言标准库中的一个函数,用于将内存中的数据从一个位置复制到另一个位置。Linux内核中的`memcpy`实现通常针对不同的架构进行了优化,以提高性能。本文档...

    C函数之memcpy()函数用法

    函数原型  void *memcpy(void*dest, const void *src, size_t n);  功能  由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始...  memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型

    内存拷贝的优化方法——

    内存拷贝优化方法 内存拷贝是计算机科学中的一种基本操作,然而,在复杂的底层网络程序中,内存拷贝、字符串比较和搜索操作很容易成为性能瓶颈所在。编译器自带的此类函数虽然做了一些通用性的优化工作,但因为在...

    浅拷贝和深拷贝PPT学习教案.pptx

    拷贝构造函数会在创建新对象时分配新的内存,复制源对象的大小`n`并创建新的数组,然后逐个元素地复制原始数组的内容。赋值运算符函数则需要检查当前对象的`n`是否与右操作对象的`n`相同,如果不相同,则需要释放...

    Memset、Memcpy、Strcpy 的作用和区别

    memcpy函数在拷贝完毕后会返回一个指向dest的指针,这个特点使得memcpy非常适合用于需要返回新对象地址的场景。 Strcpy函数原型为 char* strcpy(char* dest, char* src); 该函数用于将src指向的字符串拷贝到dest...

    memcpy函数的实现

    一个使用memcpy的实现版本,考虑内存重叠以及效率

    不调用C库函数实现memmove-memcpy函数功能

    在深入探讨如何不调用C库函数实现`memmove`和`memcpy`的功能之前...通过上述方法,我们可以不依赖C库函数,利用基本的指针操作和循环结构,实现`memcpy`和`memmove`的功能,从而在特定场景下提供更多的灵活性和控制权。

    memcpy实现 (2).pdf

    通过对比使用`Memcpy`和`memcpy`的结果,我们可以看到自定义的`Memcpy`函数成功地处理了地址重叠的情况,而标准库的`memcpy`函数则可能导致源字符串在拷贝过程中被污染,即产生了错误的结果。 总结来说,理解`...

    网络渗透——BSD的memcpy溢出利用技术

    防范memcpy溢出的方法包括使用安全的内存拷贝函数,如memcpy_s或memmove,它们会检查目标缓冲区的大小,防止溢出;使用栈保护机制,如Canary值,检测栈溢出;以及使用地址空间布局随机化(ASLR)等技术,增加攻击的...

    C++中memcpy和memmove的区别总结

    memcpy内存拷贝,没有问题;memmove,内存移动?错,如果这样理解的话,那么这篇文章你就必须要好好看看了,memmove还是内存拷贝。那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你...

    memcpy 和strcpy 的区别

    memcpy 和 strcpy 的区别 memcpy 和 strcpy 都是标准 C 库函数,都是用于从一块内存复制一段连续的数据到另一块内存,但是它们之间存在一些关键的区别。 首先,strcpy 函数用于复制字符串,它从源字符串的起始地址...

    memmove、memcpy和memccpy简介.docx

    memmove、memcpy 和 memccpy 是三个常用的内存拷贝函数,它们都用于从一个缓冲区拷贝数据到另一个缓冲区,但它们之间有一些区别。 memmove 函数 memmove 函数的定义为:`void *memmove(void *dest, const void *...

    编程函数-memcpy函数

    `memcpy`通常比使用循环逐个复制元素更快,因为它通常由编译器优化为低级别的汇编指令,这使得它在处理大块数据时特别有效。 总结来说,`memcpy`函数是C语言中一个基础且重要的内存操作工具,用于快速、有效地复制...

Global site tag (gtag.js) - Google Analytics