在性能方面,使用memcpy更好还是使用std::copy()更好?为什么?

char *bits = NULL;
...

bits = new (std::nothrow) char[((int *) copyMe->bits)[0]];
if (bits == NULL)
{
    cout << "ERROR Not enough memory.\n";
    exit(1);
}

memcpy (bits, copyMe->bits, ((int *) copyMe->bits)[0]);

当前回答

我的原则很简单。如果你正在使用c++,更喜欢c++库而不是C:)

其他回答

始终使用std::copy,因为memcpy仅限于c风格的POD结构,如果目标实际上是POD,编译器可能会用memcpy替换对std::copy的调用。

另外,std::copy可以用于许多迭代器类型,而不仅仅是指针。Std::copy更灵活,没有性能损失,是明显的赢家。

我的原则很简单。如果你正在使用c++,更喜欢c++库而不是C:)

理论上,memcpy可能具有微小的、难以察觉的、无限小的性能优势,只是因为它没有与std::copy相同的要求。从memcpy的手册页:

为避免溢出,请设置 由目标指向的数组 而源参数,应在 至少num字节,并且不应该 重叠(用于重叠内存 块,memmove是一个更安全的方法)。

换句话说,memcpy可以忽略数据重叠的可能性。(将重叠数组传递给memcpy是未定义的行为。)因此,memcpy不需要显式地检查这个条件,而std::copy可以使用,只要OutputIterator参数不在源范围内。注意,这并不是说源范围和目标范围不能重叠。

因此,由于std::copy有一些不同的要求,理论上它应该稍微慢一点(特别强调稍微慢一点),因为它可能会检查重叠的c数组,或者将c数组的复制委托给需要执行检查的memmove。但在实践中,您(和大多数分析人员)甚至可能察觉不到任何差异。

当然,如果不使用pod,无论如何也不能使用memcpy。

分析显示:std::copy()总是和memcpy()一样快或更快为false。

我的系统:

HP-Compaq-dx7500-Microtower 3.13.0-24-generic #47-Ubuntu SMP周五5月2日 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux。 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

代码(语言:c++):

    const uint32_t arr_size = (1080 * 720 * 3); //HD image in rgb24
    const uint32_t iterations = 100000;
    uint8_t arr1[arr_size];
    uint8_t arr2[arr_size];
    std::vector<uint8_t> v;

    main(){
        {
            DPROFILE;
            memcpy(arr1, arr2, sizeof(arr1));
            printf("memcpy()\n");
        }

        v.reserve(sizeof(arr1));
        {
            DPROFILE;
            std::copy(arr1, arr1 + sizeof(arr1), v.begin());
            printf("std::copy()\n");
        }

        {
            time_t t = time(NULL);
            for(uint32_t i = 0; i < iterations; ++i)
                memcpy(arr1, arr2, sizeof(arr1));
            printf("memcpy()    elapsed %d s\n", time(NULL) - t);
        }

        {
            time_t t = time(NULL);
            for(uint32_t i = 0; i < iterations; ++i)
                std::copy(arr1, arr1 + sizeof(arr1), v.begin());
            printf("std::copy() elapsed %d s\n", time(NULL) - t);
        }
    }

g++ -O0 -o test_stdcopy test_stdcopy.cpp Memcpy()配置文件:main:21: now:1422969084:04859 elapsed:2650 us Std::copy()配置文件:main:27: now:1422969084:04862 elapsed:2745 us Memcpy()消失44秒std::copy()消失45秒 g++ -O3 -o test_stdcopy test_stdcopy.cpp Memcpy()配置文件:主要:21:现在:1422969601:04939经过:2385 us Std::copy()配置文件:main:28: now:1422969601:04941 elapsed:2690 us Memcpy()消失了27秒std::copy()消失了43秒

红色警报指出,代码使用memcpy从数组到数组和std::复制从数组到向量。这可能是memcpy更快的原因。

因为有

v .储备(sizeof (arr1);

复制到向量或数组时应该没有区别。

代码在这两种情况下都固定使用数组。Memcpy更快:

{
    time_t t = time(NULL);
    for(uint32_t i = 0; i < iterations; ++i)
        memcpy(arr1, arr2, sizeof(arr1));
    printf("memcpy()    elapsed %ld s\n", time(NULL) - t);
}

{
    time_t t = time(NULL);
    for(uint32_t i = 0; i < iterations; ++i)
        std::copy(arr1, arr1 + sizeof(arr1), arr2);
    printf("std::copy() elapsed %ld s\n", time(NULL) - t);
}

memcpy()    elapsed 44 s
std::copy() elapsed 48 s 

如果你真的需要最大的复制性能(你可能不需要),这两个都不要用。

可以做很多事情来优化内存复制——如果你愿意使用多个线程/内核的话,甚至可以做得更多。例如:

在这个memcpy实现中缺少什么/不是最优的?

问题和一些答案都建议了实现或实现的链接。