在c ++ 11中复制常量数组的最简洁方法

时间:2012-09-08 05:33:02

标签: c++ arrays optimization c++11 copy

我经常发现自己想要复制具有恒定大小的数组的内容,我通常只是写下以下内容:

float a[4] = {0,1,2,3};
float b[4];

for(int i=0; i<4; i++){
    b[i]=a[i];
}

最近,我正在编写一个用于教育目的的线性微积分库,我想知道是否有更好的方法来实现它。

我想到的第一件事就是使用memcpy:

memcpy(b, a, sizeof(float) * 4);

但是这看起来很像c-like而且容易出错。我喜欢在编译时遇到错误,对于使用非平凡复制构造函数的数据类型,或者如果我忘记与sizeof(datatype)相乘,这会变得很难。

由于我正在编写一个我将要密集使用的数学库,因此性能对我来说非常重要。今天的编译器是否足够聪明,可以理解第一个例子只是复制一块内存并优化它以使其与第二个解决方案一样高效?

也许标准库中有一个功能可以帮助我? c ++ 11中的新东西?或者我应该只创建一个宏或模板函数?

5 个答案:

答案 0 :(得分:58)

如果你使用std::array而不是内置数组(你应该这样做),它会变得非常简单。复制数组与复制任何其他对象相同。

std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;

答案 1 :(得分:42)

C ++ 03的方法是使用std::copy()

float a[4] = {0,1,2,3};
float b[4];

std::copy(a,a + 4, b);

它和它一样干净。在C ++ 11上更喜欢

std::copy(std::begin(a), std::end(a), std::begin(b));

或者更好的是,使用std :: array并免费获得作业:

std::array<float,4> a = {0,1,2,3};
auto b = a;

答案 2 :(得分:16)

对C ++ 03(以及C)解决方案感兴趣 - 总是使用包含数组而不是单独数组的struct:

struct s { float arr[5]; };

默认情况下,结构是可复制的。

已经提到过它在C ++ 11中的等价物std::array<float,5>;

答案 3 :(得分:2)

#include <algorithm>
std::copy_n(a, 4, b)

答案 4 :(得分:-1)

下面的方法适用于通常的数组以及std:array。

float a[4] = {0,1,2,3};
float b[4];

std::copy(std::begin(a), std::end(a), b);