3

例えば:

a(wordwrap(str_repeat('abcdef', 500000), 160, "\n", true));    

function a($v){
  $v[1] = 'x';      
  $v = b($v);
  return $v;
}

function b($v){
  $v[2] = 'x';    
  $v = c($v);
  return $v;
}

function c($v){
  $v[3] = 'x';  
  d($v);    
}

function d($v){
  $v[4] = 'x';
  print $v;
}

これは約23MBを使用します。PHPは、変更のたびにそのテキストのコピーを作成しているからだと思います。12 MBを使用したら、テキストを印刷するだけです。

関数が呼び出される前に、どういうわけか元の変数のメモリを解放できますか?好き

unset($v);
$v = c($v);

明らかに、これはlol$vに渡される前に破棄されるため、機能しません。しかし、どういうわけか同じテキストを変更c()させたいと思います。c()参照を使用するように。(私は参照を試しましたが、おそらくPHPがより多くのコピーを作成するため、実際にはメモリ使用量が増加します)

4

1 に答える 1

1

はい、その通りです。PHPはコピーオンライトアプローチを使用しています。参照を試してみてください。例:

function a(&$v){
    $v[1] = 'x';      
    $v = b($v);
    return $v;
}

参照を試したことに気づきましたが、メモリ使用量が減っていないことを確認しますか?

于 2013-03-27T13:36:54.243 に答える