Cleanest way to copy a constant size array in c++11

C++ArraysOptimizationC++11Copy

C++ Problem Overview


I often find myself wanting to copy the contents of arrays that have a constant size, I usually just write something along the lines of:

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

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

As of lately, I am writing a linear calculus library for educational purposes, and I was wondering if there was a better way to do it.

The first thing that came to my mind, was using memcpy:

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

But this seems very c-like and error prone to me. I like having my errors at compile time, and this can get ugly for data types with non-trivial copy constructors, or if I forget to multiply with sizeof(datatype).

Since I am writing a math library that I am going to use intensively, performance is very important to me. Are the compilers today smart enough to understand that the first example is just copying a chunk of memory and optimize it to be as efficient as the second solution?

Perhaps there is a function in the standard library that can help me? Something new in c++11? Or should I just create a macro or a template function?

C++ Solutions


Solution 1 - C++

If you use std::array instead of a built-in array (which you should), it becomes very simple. Copying an array is then the same as copying any other object.

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

Solution 2 - C++

The C++03 way

Use std::copy():

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

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

That's about as clean as it gets.

The C++11 way

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

If you can use std::array

With std::array you just do simple assignment:

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

Solution 3 - C++

For interested in C++03 (and also C) solution - always use struct containing an array instead of solely array:

struct s { float arr[5]; };

Structs are copyable by default.

Its equivalent in C++11 is,already mentioned, std::array<float,5>;

Solution 4 - C++

Below method works for usual arrays as well std:array.

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

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

Solution 5 - C++

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbobbalubaView Question on Stackoverflow
Solution 1 - C++Benjamin LindleyView Answer on Stackoverflow
Solution 2 - C++MysticialView Answer on Stackoverflow
Solution 3 - C++PiotrNyczView Answer on Stackoverflow
Solution 4 - C++Shital ShahView Answer on Stackoverflow
Solution 5 - C++hjbabsView Answer on Stackoverflow