我在阅读有关 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])
,但编译器不会对此报错,而且这个错误可能一开始就不会被注意到。 std::array
不会发生这种情况:
void takeStdArray(std::array<int, 5>& arr);
std::array<int, 3> arr;
takeStdArray(arr); // compiler error!
关于c++ - 通过在堆栈上传递 std::array 进行 API 调用是否有优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50961665/