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

标签 c++ arrays stl

我在阅读有关 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/

相关文章:

c++ - 在Qt中集成一个Bullet简单demo

c++ - 有什么方法可以将 cookie 传递给 IWebBrowser2 导航

c++ - 如何交换 map 元素

c++ - std::vector 的自包含、STL 兼容实现

c++ - 使用 MPI 环形拓扑通过比较每个处理器的局部最大值来找到函数的全局最大值

C++-CLI Pipeline 只返回错误信息的第一行

javascript - 在对象数组中搜索条目匹配变量,并检查它是否与其他字段匹配

java - 我如何改变这个贪心算法来预测最全面的分数?

javascript - 如何将文本区域中的空格或换行符转换为逗号分隔的 PHP 数组

c++ - 如何学习编写地道的 C++ 代码