通过在堆栈上传递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调用是否有优势的主要内容,如果未能解决你的问题,请参考以下文章