在函数中操作 std::array

Manipulating std::array in a function

我的代码中有一个固定大小的多维数组,我需要能够在单独的函数中更改其中的值。我想知道,std::arrays 是在方法中作为引用传递还是复制?那么我可以这样做吗:

using std::array;

void foo (array<array<int,WIDTH>,HEIGHT> bar);
//manipulates the values in the array
...

int main() {
  array<array<int,WIDTH>,HEIGHT> baz;
  ...
  foo(baz);
  //baz is changed
}

或者我需要明确地把它变成参考吗?我担心如果我创建一个返回副本的数组函数,它会太乱而且速度不快。

如果您想避免制作副本,请通过引用(或指针)传递:

void foo (array<array<int,WIDTH>,HEIGHT> &bar);

I want to know, are std::arrays passed as references in a method or is a copy made?

std::array 是值类型。如果按值传递,将(概念上)创建一个副本。

这与 c 风格数组 (int bar[HEIGHT][WIDTH]) 的行为不同。 C风格的数组通过引用传递。这是由于很久以前 C 语言的一个基本设计决定(有些人会说是错误)。

do I need to explicitly turn it into a reference?

如果你想传递参考,是的。

I fear that if I created an array function that returned a copy, it would be too messy

函数式程序员会争辩说它更干净。

and not as fast.

小心这样的假设。出于其他原因,

a) 编译器并不总是按照你告诉他们的去做。他们可以编写代码,其效果就好像他们已经按照您告诉他们的那样做了,但可以更快地达到相同的结果。 (google: "as-if rule c++")

b) 现代 CPU 架构经过专门设计,非常擅长移动连续的内存块。

尽可能编写最简洁的代码,使用抽象概念清楚地表达您的意图。如果程序运行太慢、使用太多内存、耗电太多或您的最终用户抱怨,那么也许是时候考虑按引用或按值优化了。

但是,我可以向您保证,您在执行速度上看到的任何延迟更有可能是由于您对 IO 的处理,或者是由于选择了具有高时间复杂度的算法。