2012-08-16 34 views
5

Theo hiểu biết của tôi, khi tôi chuyển mảng theo giá trị, bản sao mảng được tạo. ví dụ: bên dưới chương trình $ y & $ z cần cùng một bộ nhớ với giá $ x. tuy nhiên việc sử dụng bộ nhớ hầu như không tăng lên. Rõ ràng sự hiểu biết của tôi là sai, Bất cứ ai có thể giải thích lý do.Php được chuyển bởi giá trị hoặc tham chiếu

for($i=0;$i<1000000;$i++) 

     $x[] = $i; // memory usage : 76519792 


echo memory_get_usage(); 

function abc($y){ 

    $y[1] = 1; //memory usage : 76519948 
    $z[]= $y; //memory usage : 76520308 

} 
+3

Tôi tin rằng php không thực sự * sao chép * dữ liệu trừ khi bạn sửa đổi một trong hai ví dụ. –

Trả lời

3

Tôi nghe nói rằng php sử dụng copy-on-write: http://en.wikipedia.org/wiki/Copy-on-write

làm ví dụ:

<? 
for($i=0;$i<100000;$i++) 
    $x[] = $i; 

// we output the memory use: 
echo memory_get_usage().'<br/>'; // outputs 14521040 

// here we equate $y to $x, but instead of creating a copy, 
// php engine just creates a pointer to the same memory space 
$y = $x; 

echo memory_get_usage().'<br/>'; // outputs 14521128 

// here we change something in y, now php engine 
// "creates a seperate copy" for y and makes the change 
$y[1]=8; 

echo memory_get_usage().'<br/>'; // outputs 23569904 

?> 

và tương tự như hành vi với chức năng gọi:

<? 
for($i=0;$i<100000;$i++) 
    $x[] = $i; 

echo memory_get_usage().'<br/>'; /* 14524968 */ 

function abc($y){ 
    echo memory_get_usage().'<br/>'; /* 14524968 */ 
    $y[1] = 1; 
    echo memory_get_usage().'<br/>'; /* 23573752 */ 
    $z[]= $y; 
    echo memory_get_usage().'<br/>'; /* 23574040 */ 

} 
abc($x); 
echo memory_get_usage().'<br/>'; /* 14524968 */ 
?> 

PS: Tôi đang thử nghiệm này trên các cửa sổ, có thể nó là khác nhau trên linux

+2

Dự kiến ​​upvote, bởi vì đó là câu trả lời đúng. Bạn nên xây dựng tốt hơn mặc dù. – deceze

+0

dòng kiểm tra $ y [1] = $ y; bộ nhớ vẫn tăng lên hầu như không – chicharito

+0

@chicharito Động cơ Zend thông minh hơn bạn nghĩ là bộ nhớ WRT. Bạn chỉ đang sửa đổi một phần dữ liệu duy nhất ở đó, vì vậy không có nhiều thứ để làm. – deceze

Các vấn đề liên quan