[Moscow.pm] XS как переименовать модуль?

Ruslan Zakirov ruz на bestpractical.com
Вт Фев 1 12:04:47 PST 2011


2011/2/1 Ivan Petrov <i.petro.77.00 на gmail.com>:
>
>> $str = 0x1000; $str = '';
>
> а вот это не совсем то, вернее совсем не то.
>
>
> одно дело при создании скаляра - выделить заранее память, а совсем другое
> дело - выделить память *и заполнить ее значением*.
>
> используя XS можно сделать первое, а вот данная конструкция делает второе.

Вы сказали у вас проблема с realloc, мы предложили вам решение. Если
вы заглянете в av_extend, то увидите, что он также заполняет доступное
пространство undef'ами. Вот только AvFILL у массива не двигает.
Сравните код с функцией av_fill, которая эквивалент $#a = x;. По этому
во всех примерах сначала расширяем до нужного размера, потом
уменьшаем. Ну нету av_extend в perl, но ничего не мешает его сделать.

> то же самое и с массивами. когда мы пишем $#a = 1000; реально создается 1000
> скаляров и если затем сказать push @a => $b; то $b запишется по 1001
> индексу,

Ничего не создается. Записывается ссылка на PL_sv_undef.

> а вот если мы в C скажем av_extend(a, 1000), а затем следом av_push(a, b),
> то в результате у нас будет массив из одного элемента, но не требующий
> переаллокации до тех пор пока не допушимся до 1000-го элемента

my @a = (1..2);
Dump \@a;
my $len = @a;
$#a = 1000;
Dump \@a;
$#a = $len;
Dump \@a;

К сожалению без двойного прохода не получится.  Опубликуйте
List::Util::Internals и Scalar::Util::Internals вам будут благодарны
программисты со сложными алгоритмами, где realloc становится
проблемой.

> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm