bob*_*uba 40 c++ arrays optimization copy c++11
我经常发现自己想要复制具有恒定大小的数组的内容,我通常只是写下以下内容:
float a[4] = {0,1,2,3};
float b[4];
for(int i=0; i<4; i++){
b[i]=a[i];
}
Run Code Online (Sandbox Code Playgroud)
最近,我正在编写一个用于教育目的的线性微积分库,我想知道是否有更好的方法来实现它.
我想到的第一件事就是使用memcpy:
memcpy(b, a, sizeof(float) * 4);
Run Code Online (Sandbox Code Playgroud)
但这看起来很像c-like而且容易出错.我喜欢在编译时遇到错误,对于具有非平凡复制构造函数的数据类型,或者如果我忘记与sizeof(datatype)相乘,这会变得很难看.
由于我正在编写一个我将要密集使用的数学库,因此性能对我来说非常重要.今天的编译器是否足够聪明,可以理解第一个例子只是复制一块内存并将其优化为与第二个解决方案一样高效?
也许标准库中有一个功能可以帮助我?c ++ 11中的新东西?或者我应该只创建一个宏或模板函数?
Ben*_*ley 62
如果你使用std::array而不是内置数组(你应该使用),它变得非常简单.复制数组与复制任何其他对象相同.
std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;
Run Code Online (Sandbox Code Playgroud)
Mys*_*ial 43
C++ 03的方法是使用std::copy():
float a[4] = {0,1,2,3};
float b[4];
std::copy(a,a + 4, b);
Run Code Online (Sandbox Code Playgroud)
那就像它变得干净一样.在C++ 11上更喜欢
std::copy(std::begin(a), std::end(a), std::begin(b));
Run Code Online (Sandbox Code Playgroud)
或者更好的是,使用std :: array并免费获得赋值:
std::array<float,4> a = {0,1,2,3};
auto b = a;
Run Code Online (Sandbox Code Playgroud)
Pio*_*ycz 16
对C++ 03(以及C)解决方案感兴趣 - 总是使用包含数组而不是单独数组的struct:
struct s { float arr[5]; };
Run Code Online (Sandbox Code Playgroud)
结构默认是可复制的.
已经提到过它在C++ 11中的等价物, std::array<float,5>;
下面的方法也适用于普通数组以及 std:array。
float a[4] = {0,1,2,3};
float b[4];
std::copy(std::begin(a), std::end(a), b);
Run Code Online (Sandbox Code Playgroud)