That's what I was afraid of. So it does copy the entire array. Crap. :-)
Am I correct that each level in the array represents its own ZVal, with the
additional memory overhead a ZVal has (however many bytes that is)?
That is, the array below would have $a, foo, bar, baz, bob, narf, poink,
poink/narf = 8 ZVals? (That seems logical to me because each its its own
variable that just happens to be an array, but I want to be sure.)
--Larry Garfield
On Wednesday, January 19, 2011 1:01:44 am Ben Schmidt wrote:
> It does the whole of $b. It has to, because when you change 'baz', a
> reference in 'bar' needs to change to point to the newly copied 'baz', so
> 'bar' is written...and likewise 'foo' is written.
>
> Ben.
>
> On 19/01/11 5:45 PM, Larry Garfield wrote:
> > Hi folks. I have a question about the PHP runtime that I hope is
> > appropriate for this list. (If not, please thwap me gently; I bruise
> > easily.)
> >
> > I know PHP does copy-on-write. However, how "deeply" does it copy when
> > dealing with nested arrays?
> >
> > This is probably easiest to explain with an example...
> >
> > $a['foo']['bar']['baz'] = 1;
> > $a['foo']['bar']['bob'] = 1;
> > $a['foo']['bar']['narf'] = 1;
> > $a['foo']['poink']['narf'] = 1;
> >
> > function test($b) {
> >
> > // Assume each of the following lines in isolation...
> >
> > // Does this copy just the one variable baz, or the full array?
> > $b['foo']['bar']['baz'] = 2;
> >
> > // Does this copy $b, or just $b['foo']['poink']?
> > $b['foo']['poink']['stuff'] = 3;
> >
> > return $b;
> >
> > }
> >
> > // I know this is wasteful; I'm trying to figure out just how wasteful.
> > $a = test($a);
> >
> > test() in this case should take $b by reference, but I'm trying to
> > determine how much of a difference it is. (In practice my use case has
> > a vastly larger array, so any inefficiencies are multiplied.)
> >
> > --Larry Garfield
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php