0

PHPでいくつかのオブジェクトのサイズをテストするためにこのコードを書きました

<?php
class MyClass
{
    public $string1="first string";
    public $string2="second string";
    public $string3="third string";

    public function __toString() {
        return $this->string;
    }
}

function mem() {
    return memory_get_usage(false);
}


$before = mem();
$class = new MyClass;
var_dump("new object size: ".(mem() -$before));

$before=mem();
$string = "test";
var_dump("string size: ".(mem() -$before));

$before=mem();
$objcopy = $class;
var_dump("object copy size: ".(mem() -$before));

$before=mem();
$objref = &$class;
var_dump("object reference size: ".(mem() -$before));

これは私のシステムの出力です:

string(20) "new object size: 188"
string(15) "string size: 80"
string(20) "object copy size: 44"
string(25) "object reference size: 72"

私は今かなり混乱しています。なぜ $class>$string>$objref>$objcopy があるのですか?

代わりにすべきではありません: $class=$objcopy>$string>$objref ?

実際、$objcopy には内部に 3 つの文字列が含まれていますが、代わりに $string は単一の文字列です。

この種のオブジェクトでphpがメモリを処理する方法を誰かが説明してもらえますか?

前もって感謝します。

4

2 に答える 2

1

あなたは間違った仮定に基づく観察です。

まず、 your$objcopyは と同じインスタンスへの参照です。これは、インスタンスを別の変数に割り当てるときに$classインスタンスが複製されないためです。マニュアルを確認するか、これをコードに追加します。

$objcopy->string1 = 'a';
echo $class->string1, "\n";

第 2 に、代入演算子が効果的に別のオブジェクトを指すようにしたとしても、PHP はコピー オン ライト最適化を使用するため、おそらく新しいメモリを割り当てません。 intro.php .

最後に、PHP から返される正確なメモリ情報は期待できません。現在のステートメントが必要とする以上のメモリを割り当てたり、ガベージ コレクタによって暗黙的にメモリを解放したりする場合があります。(まあ、少なくともそれをオフにすることができます。)

于 2013-10-10T14:09:26.410 に答える
0

はい、私の質問は、C++ および他の言語の参照の観点から導き出された間違った知識に基づいていました。

そのため、長い調査の結果、この引数についてブログに投稿を作成し、php がメモリを処理する方法について詳しく説明しました。

http://hyperweb2.com/home/blog/2013/10/11/php-reference-vs-copy-vs-clone/

于 2013-10-11T10:30:55.483 に答える