我的代码中有一个固定大小的多维数组,我需要能够在单独的函数中更改其中的值。我想知道,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
}
还是我需要明确地将其转换为参考?我担心如果我创建了一个返回副本的数组函数,那会太乱而且不会那么快。
答案 0 :(得分:4)
我想知道,std :: array是作为方法中的引用传递的还是复制的?
std::array
是一种值类型。如果按值传递,将(从概念上)复制一份。
这与c样式数组(int bar[HEIGHT][WIDTH]
)的行为不同。 c样式数组通过引用传递。这是由于许多月前使用C语言进行的基本设计决策(有些人会说错误)。
我需要显式地将其转换为参考吗?
如果您希望传递参考,是的。
我担心如果我创建了一个返回副本的数组函数,那会太乱了
功能程序员会认为它更干净。
而不是那么快。
请注意此类假设。出于其他原因,
a)编译器并不总是按照您的要求做。他们可以编写与您完成的操作具有相同效果的代码,但是可以更快地达到相同的结果。 (google:“作为规则的c ++”)
b)现代CPU体系结构经过专门设计,非常擅长移动连续的内存块。
使用抽象的概念清楚地表达您的意图,从而编写出最干净的代码。如果程序运行太慢,使用了太多的内存,使用了太多的电源或者您的最终用户抱怨,那么也许是时候考虑按引用或按值进行优化了。
但是,我可以向您保证,在处理IO时或由于选择显示时间复杂度高的算法而导致执行速度出现任何延迟的可能性更大。
答案 1 :(得分:3)
如果要避免复制,则按引用(或指针)传递:
void foo (array<array<int,WIDTH>,HEIGHT> &bar);