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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过在堆栈上传递std :: array进行API调用是否有优势相关的知识,希望对你有一定的参考价值。

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

答案

确实,你可以用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!

以上是关于通过在堆栈上传递std :: array进行API调用是否有优势的主要内容,如果未能解决你的问题,请参考以下文章

将std :: array变量作为参数传递

变长 std::array 像

将 std::array 传递给函数:默认值

传递给第三方 API 时的 C++ const std:string& 安全性

std::array 的项目无意中脱离上下文而更改

来自指针的 std::array 或 std::vector