指针与值参数和接收者的权衡

Pointer vs Value arguments and receivers trade-offs

我来自 C++ 世界,使用诸如移动语义和 RVO 之类的东西。 从那以后,我想知道按值传递参数时是否有任何取舍?

就我而言,我有相当大的结构需要传递给一堆函数。据我了解,每次我将值传递给函数时,都会创建一个副本。传递指针而不是传递值会更好吗?

我看到唯一的权衡是原始对象可能被意外或无意地更改,调用者不清楚传递的参数不应被修改。

传值不修改是否有优化?

没有对此进行优化,所有内容都会被复制。它归结为被复制的不同字段的数量(即,如果您有一个结构成员,那么其中的字段数量当然也很重要)。

因此,如果您有非常复杂的结构,并且性能非常重要,以至于这可能成为瓶颈,那么即使是不可变的东西,您也应该使用指针。

我编写了一个小基准测试,它调用了一个方法,该方法对具有 15 个字段的结构不执行任何操作。一种方法是指针,另一种是值方法。结果:

BenchmarkValue  100000000           12.1 ns/op
BenchmarkPointer    2000000000           0.42 ns/op