C++ 在堆栈上为API调用传递std::array是否有优势
我读到了关于C++ 在堆栈上为API调用传递std::array是否有优势,c++,arrays,stl,C++,Arrays,Stl,我读到了关于std::array和C类型array之间的关键区别,并了解到其中一个关键区别是,当调用API时,C类型array作为指针,而std::array的副本被传递。其中一个博客提到这是一个优势,但我不这么认为。与C型数组相比,使用std::array的主要优势是什么?我的探索和理解表明,几乎所有的事情都可以用C型数组来完成。它们甚至可以传递给STL算法。因此,我不认为使用std::array比使用C-type数组有任何关键优势。实际上是这样吗?确实,您可以用std::array做的所有事
std::array
和C类型array之间的关键区别,并了解到其中一个关键区别是,当调用API时,C类型array作为指针,而std::array
的副本被传递。其中一个博客提到这是一个优势,但我不这么认为。与C型数组相比,使用std::array
的主要优势是什么?我的探索和理解表明,几乎所有的事情都可以用C型数组来完成。它们甚至可以传递给STL算法。因此,我不认为使用std::array
比使用C-type数组有任何关键优势。实际上是这样吗?确实,您可以用std::array
做的所有事情都可以用C array完成。实际上,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
}
在本例中,takeCArray
实际使用指针。它应该是takeCArray(int(&arr)[5])
,但编译器不会对此抱怨,而且这个bug可能在一开始就被忽略了。这不能发生在std::array
:
void takeStdArray(std::array<int, 5>& arr);
std::array<int, 3> arr;
takeStdArray(arr); // compiler error!
void takeStdArray(标准::数组和arr);
std::阵列arr;
takeStdArray(arr);//编译器错误!
确实,您可以使用std::array
执行的所有操作都可以使用C array完成。实际上,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
}
在本例中,takeCArray
实际使用指针。它应该是takeCArray(int(&arr)[5])
,但编译器不会对此抱怨,而且这个bug可能在一开始就被忽略了。这不能发生在std::array
:
void takeStdArray(std::array<int, 5>& arr);
std::array<int, 3> arr;
takeStdArray(arr); // compiler error!
void takeStdArray(标准::数组和arr);
std::阵列arr;
takeStdArray(arr);//编译器错误!
struct将C样式数组的性能和可访问性与标准容器的优点结合在一起,例如了解其自身的大小、支持赋值、随机访问迭代器等(),因为标准比较运算符对于std::array
是重载的。关于通过值传递时对std::array
的复制,那么不需要吗?使用引用。该结构将C样式数组的性能和可访问性与标准容器的优点结合在一起,例如了解其自身大小、支持赋值、随机访问迭代器等(),因为标准比较运算符对于std::array
是重载的。关于通过值传递时对std::array
的复制,那么不需要吗?使用参考资料。