代码之家  ›  专栏  ›  技术社区  ›  hvertous

排序算法的最佳方法[重复]

  •  2
  • hvertous  · 技术社区  · 5 年前

    在C++中,如果将一个大数组传递给函数,则需要通过引用传递它,这样它就不会被复制到新函数中浪费内存。如果不想修改它,可以通过const引用传递它。

    0 回复  |  直到 11 年前
        1
  •  65
  •   fresskoma    11 年前

    以下内容不适用于对象,因为这里已经说明了这一点。如果打算修改传递的值,通过引用传递数组和标量值只会节省内存,因为PHP使用一个copy-on-change(也称为copy-on-write)策略。例如:

    # $array will not be copied, because it is not modified.
    function foo($array) {
        echo $array[0];
    }
    
    # $array will be copied, because it is modified.
    function bar($array) {
        $array[0] += 1;
        echo $array[0] + $array[1];
    }
    
    # This is how bar shoudl've been implemented in the first place.
    function baz($array) {
        $temp = $array[0] + 1;
        echo $temp + $array[1];
    }
    
    
    # This would also work (passing the array by reference), but has a serious 
    #side-effect which you may not want, but $array is not copied here.
    function foobar(&$array) {
        $array[0] += 1;
        echo $array[0] + $array[1];
    }
    

    总结一下:

    • 如果您正在处理一个非常大的数组,并计划在函数中修改它,那么实际上应该使用引用来防止它被复制,这样会严重降低性能,甚至耗尽内存限制。

    • 如果这是可以避免的(即小数组或标量值),我总是使用没有副作用的函数式方法,因为只要通过引用传递某个对象,就永远无法确定传递的变量在函数调用后可能包含什么,这有时会导致讨厌的、难以找到的bug。

    • IMHO标量值永远不应该通过引用传递,因为性能影响不会太大,以至于无法证明代码中的透明度损失是合理的。

        2
  •  11
  •   Matthew    13 年前

    简单的回答是当你需要的时候使用参考资料 功能

    一切都是通过值传递的,包括对象。然而,这是 手柄

    那么它提供了什么功能呢?它使您能够修改调用范围中的变量:

    class Bar {}
    $bar = new Bar();
    
    function by_val($o) { $o = null; }
    function by_ref(&$o) { $o = null; }
    
    by_val($bar); // $bar is still non null
    by_ref($bar); // $bar is now null
    

    $foo = modify_me($foo);
    

        3
  •  9
  •   Pascal MARTIN    13 年前

    • 对象通过引用传递 1
    • 默认情况下,数组和标量按值传递;并且可以传递 by reference & 在函数的声明中。


    Do not use PHP references


    1 Objects and references