C++ 在C+;中复制阵列的最快可移植方式是什么+;

C++ 在C+;中复制阵列的最快可移植方式是什么+;,c++,arrays,copy,C++,Arrays,Copy,这个问题困扰了我一段时间。我正在考虑的可能性是 memcpy 复制 cblas_数据副本 有人知道这三种方法的利弊吗?也欢迎其他建议。在大多数情况下,memcpy将是最快的,因为它是最低级别的,并且可以在给定平台上用机器代码实现。(但是,如果数组包含非平凡对象,memcpy可能无法正确思考,因此使用std::copy可能更安全) 然而,这完全取决于stdlib在给定平台上的植入程度等。由于标准没有说明操作速度必须有多快,因此无法知道“便携式”中的操作速度,因为什么是最快的 分析应用程序将显示给定

这个问题困扰了我一段时间。我正在考虑的可能性是

  • memcpy
  • 复制
  • cblas_数据副本

  • 有人知道这三种方法的利弊吗?也欢迎其他建议。

    在大多数情况下,memcpy将是最快的,因为它是最低级别的,并且可以在给定平台上用机器代码实现。(但是,如果数组包含非平凡对象,memcpy可能无法正确思考,因此使用std::copy可能更安全)

    然而,这完全取决于stdlib在给定平台上的植入程度等。由于标准没有说明操作速度必须有多快,因此无法知道“便携式”中的操作速度,因为什么是最快的

    分析应用程序将显示给定平台上的fasted,但只会告诉您有关测试平台的信息


    但是,当您分析应用程序时,您很可能会发现问题在于您的设计,而不是您选择的阵列复制方法。(例如,为什么需要复制大型阵列以便匹配?

    只需分析您的应用程序。你可能会发现拷贝不是最慢的部分。但是, pMeMcPy,但是,如果你的数组包含非平凡对象,那么坚持STD::/Prime.< /P> < P> C++,你应该使用STD::复制,除非你有充分的理由否则。原因是C++类通过复制构造函数和复制赋值操作符来定义自己的复制语义,并且列出的操作仅是STD::复制尊重这些约定。 MycPy.()使用数据的原始、字节复制(虽然可能对缓存行大小进行了极大的优化),而忽略C++复制语义(毕竟是C函数)。 cblas_dcopy()是一个专用函数,用于使用双精度浮点值的线性代数例程。它可能在这方面做得很好,但不应该被认为是通用的

    如果您的数据是“简单”POD类型的结构数据或原始的基本类型数据,那么memcpy可能会以您所能获得的速度运行。同样可能的是,std::copy将被优化以在这些情况下使用memcpy,因此您永远不会知道其中的区别


    简而言之,使用std::copy()。

    我不得不认为其他人会调用memcpy()。话虽如此,我不敢相信会有任何明显的差别

    如果它真的对你很重要,请将所有三个代码都运行并运行一个分析器,但是最好考虑可读性/可维护性、异常安全性等。(并在编写汇编程序插入时编写代码,但这并不是说您可能会看到差异)

    你的程序是线程化的吗


    最重要的是,如何对数组进行降阶?(它是什么数组)以及它有多大?

    memcpy
    可能是复制连续内存块的最快方法。这是因为它可能会针对特定的硬件进行高度优化。它通常作为内置的编译器函数实现

    已经说过,非POD C++对象不太可能是连续的,因此使用<代码> MycPy复制C++对象数组可能会给你带来意想不到的结果。当复制C++对象的数组(或集合)时,<>代码> STD::复制< /Cord>将使用对象自己的复制语义,因此适合与非POD C++对象一起使用。


    cblas\u dcopy
    看起来像是一个用于特定库的副本,在不使用该库时可能没有什么用处。

    使用
    std::copy
    ,除非分析显示您在其他情况下有必要的好处。它尊重C++对象封装,调用复制构造函数和赋值操作符,实现可以包括其他内联优化。如果要复制的类型从简单可复制的更改为不可复制的,则更易于维护

    正如PeterCordes在下面的评论,现代编译器(如GCC和clang)在内部分析
    memcpy()
    请求,通常避免越位函数调用,甚至在这之前,有些系统的
    memcpy()
    宏的内联拷贝数低于一定的大小阈值

    FWIW/在我手边的旧Linux机器上(2010年),GCC没有做任何惊人的优化,但是
    bits/type_traits.h
    允许程序轻松指定
    std::copy
    是否应该通过
    memcpy()
    (参见下面的代码),因此没有理由避免使用
    std::copy()
    直接支持
    memcpy()

     * Copyright (c) 1997
     * Silicon Graphics Computer Systems, Inc.
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and            
     * that both that copyright notice and this permission notice appear            
     * in supporting documentation.  Silicon Graphics makes no                      
     * representations about the suitability of this software for any               
     * purpose.  It is provided "as is" without express or implied warranty.        
     ...                                                                            
                                                                                
    /*                                                                              
    This header file provides a framework for allowing compile time dispatch        
    based on type attributes. This is useful when writing template code.            
    For example, when making a copy of an array of an unknown type, it helps        
    to know if the type has a trivial copy constructor or not, to help decide       
    if a memcpy can be used.
    
    The class template __type_traits provides a series of typedefs each of
    which is either __true_type or __false_type. The argument to
    __type_traits can be any type. The typedefs within this template will
    attain their correct values by one of these means:
        1. The general instantiation contain conservative values which work
           for all types.
        2. Specializations may be declared to make distinctions between types.
        3. Some compilers (such as the Silicon Graphics N32 and N64 compilers)
           will automatically provide the appropriate specializations for all
           types.
    
    EXAMPLE:
    
    //Copy an array of elements which have non-trivial copy constructors
    template <class _Tp> void
      copy(_Tp* __source,_Tp* __destination,int __n,__false_type);
    //Copy an array of elements which have trivial copy constructors. Use memcpy.
    template <class _Tp> void
      copy(_Tp* __source,_Tp* __destination,int __n,__true_type);
    
    //Copy an array of any type by using the most efficient copy mechanism
    template <class _Tp> inline void copy(_Tp* __source,_Tp* __destination,int __n) {
       copy(__source,__destination,__n,
            typename __type_traits<_Tp>::has_trivial_copy_constructor());
    }
    */
    
    *版权所有(c)1997
    *硅图形计算机系统公司。
    *
    *使用、复制、修改、分发和销售本软件的权限
    *特此免费授予其任何用途的文件,
    *前提是上述版权声明出现在所有副本中,并且
    *版权声明和本许可声明均出现
    *在证明文件中。硅图形不会造成任何问题
    *关于本软件适用于任何用途的陈述
    *目的。按“原样”提供,无明示或暗示担保。
    ...                                                                            
    /*                                                                              
    此头文件提供了一个允许编译时分派的框架
    基于类型属性。这在编写模板代码时很有用。
    例如,在复制未知类型的数组时,它会有所帮助
    要知道该类型是否具有普通的复制构造函数,请帮助决定
    如果可以使用memcpy。
    类模板type traits提供了一系列的typedef
    它是uuu true_u类型或uuu false_u类型。反对