|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Sergey Skvortsov 2:5020/400 05 Jan 2004 12:26:14 To : Kan Subject : Re: ссылки на строки -------------------------------------------------------------------------------- kan wrote: > SS> сравниваем PV и ужасаемся. > SV = PV(0x1a7eb60) at 0x1a72ff0 > PV = 0x1a70a38 "test"\0 > SV = RV(0x1a8ab2c) at 0x1a72f9c > PV = 0x1a70a38 "test"\0 > А почему это тебя не заставляет pадоваться я никак понять не могу? Hе можешь? Поясняю. Представь, что в $a 10 мегабайт текста. $b=$a приводит именно к удвоению затрачиваемой памяти. Хотя, возможно, ты $b никогда не вздумаешь модифицировать. Так что, к примеру, вызов func($a); sub func { my $b=shift; print $b; } Приводит к неуместному копированию. Обычный print не понимает, если ему дать ссылку на скаляр - он честно вызывает аналог overload::Stringify и радует чем-то типа SCALAR(0x423423). Apache::Request->print очень даже удобно воспринимает ссылку - автоматически делая dereference. Так же обещается в обычном print в Perl6. Разумеется можно жить и с ссылками на скаляр. Hо смысл? Hеудобно. Во флагах структуры SV уже есть замечательный флаг SvFAKE, который позволяет одному sv хранить реальный PV, а другому - помеченному как FAKE - иметь в PV тот же адрес - но не освобождаемый при destroy скаляра и автоматически (почти) копируемый при изменении скалара. Если вы знаете fork() - идея должна быть понятной. Идеальной была бы новая альтернативная операция присваивания, например: $b===$a; которая реализовывала бы подобную логику. Hо, увы, не всё так просто. -- Sergey Skvortsov mailto: skv@protey.ru Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.1 * Origin: Talk.ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6488ade0a296.html, оценка из 5, голосов 10
|