指针与值参数和接收者的权衡
Pointer vs Value arguments and receivers trade-offs
我来自 C++ 世界,使用诸如移动语义和 RVO 之类的东西。
从那以后,我想知道按值传递参数时是否有任何取舍?
就我而言,我有相当大的结构需要传递给一堆函数。据我了解,每次我将值传递给函数时,都会创建一个副本。传递指针而不是传递值会更好吗?
我看到唯一的权衡是原始对象可能被意外或无意地更改,调用者不清楚传递的参数不应被修改。
传值不修改是否有优化?
没有对此进行优化,所有内容都会被复制。它归结为被复制的不同字段的数量(即,如果您有一个结构成员,那么其中的字段数量当然也很重要)。
因此,如果您有非常复杂的结构,并且性能非常重要,以至于这可能成为瓶颈,那么即使是不可变的东西,您也应该使用指针。
我编写了一个小基准测试,它调用了一个方法,该方法对具有 15 个字段的结构不执行任何操作。一种方法是指针,另一种是值方法。结果:
BenchmarkValue 100000000 12.1 ns/op
BenchmarkPointer 2000000000 0.42 ns/op
我来自 C++ 世界,使用诸如移动语义和 RVO 之类的东西。 从那以后,我想知道按值传递参数时是否有任何取舍?
就我而言,我有相当大的结构需要传递给一堆函数。据我了解,每次我将值传递给函数时,都会创建一个副本。传递指针而不是传递值会更好吗?
我看到唯一的权衡是原始对象可能被意外或无意地更改,调用者不清楚传递的参数不应被修改。
传值不修改是否有优化?
没有对此进行优化,所有内容都会被复制。它归结为被复制的不同字段的数量(即,如果您有一个结构成员,那么其中的字段数量当然也很重要)。
因此,如果您有非常复杂的结构,并且性能非常重要,以至于这可能成为瓶颈,那么即使是不可变的东西,您也应该使用指针。
我编写了一个小基准测试,它调用了一个方法,该方法对具有 15 个字段的结构不执行任何操作。一种方法是指针,另一种是值方法。结果:
BenchmarkValue 100000000 12.1 ns/op
BenchmarkPointer 2000000000 0.42 ns/op