通过在堆栈上传递std :: array进行API调用是否有优势

问题描述 投票:0回答:1

我正在阅读std::array和C类型数组之间的主要区别,并且知道其中一个关键区别是当调用API时,C类型数组作为指针而std::array的副本被传递。其中一个博客提到这是一个优势,但我不这么认为。使用std::array而不是C型阵列有哪些主要优势?我的探索和理解表明,几乎所有东西都可以用C型数组完成。它们甚至可以传递给STL算法。所以我没有看到使用std::array而不是C型数组的任何关键优势。那是真的吗?

c++ arrays stl
1个回答
2
投票

确实,你可以用std::array做的所有事情都可以用C数组来完成。实际上,std::array只是在内部包装一个固定大小的C数组。但是,std::array通常更方便。

能够按值传递数组是一个优势。如果您想使用C数组执行此操作,则必须传递指针和大小,然后创建本地副本。使用std::array,您可以避免这种情况,并选择更适合您需求的产品:

void takeArrayByValue(std::array<int, 5> arr)
{
    arr[0] = newValue; // arr is a local copy, caller does not see this
}

void takeArrayByReference(std::array<int, 5>& arr)
{
     arr[0] = newValue; // variable passed as argument is modified
}

// compare with this:
void takeCArrayAndMakeLocalCopy(const int (&arr)[5])
{
    int localArr[5];
    std::copy(std::begin(arr), std::end(arr), localArr);

   // do something with localArr
}

另一件事:误用C数组更容易:

void takeCAray(int arr[5]);

int arr[3];
takeCArray(arr); // compiles

在这个例子中,takeCArray真的需要一个指针。它应该是takeCArray(int (&arr)[5]),但编译器不会抱怨这个,并且该bug最初可能会被忽视。 std::array不会发生这种情况:

void takeStdArray(std::array<int, 5>& arr);

std::array<int, 3> arr;
takeStdArray(arr); // compiler error!
© www.soinside.com 2019 - 2024. All rights reserved.