Size: a a a

2021 January 22

VO

Vyacheslav Olkhovche... in Modern::Perl
какой еще код потребителя? причем он тут?
источник

VG

Vadim Goncharov in Modern::Perl
в этом месте ты массив сложил, после return эти ссылки исчезли
источник

VG

Vadim Goncharov in Modern::Perl
будут те, которые в потребителе
источник

VG

Vadim Goncharov in Modern::Perl
т.е. там, куда return
источник

VO

Vyacheslav Olkhovche... in Modern::Perl
ну и? до него (потребителя) содержимое по ссылкам доедет? не просрется не перезапишется чем-то еще?
источник

W

Warstone in Modern::Perl
Vyacheslav Olkhovchenkov
foreach () { 
$ret = ext_sub();
push @res, [ 'xxx', \$ret->{value} ];
}
return @res;
что-то типа такого
Чтобы по простому... Не передавайте значений. Передавайте ссылки. Тогда точно не будет копирования.

В $ret вернули или скаляр или ссылку на хеш / массив (ссылка вообще так-же является скаляром, но размером ссылки можно пренебречь).
Его уже можно передавать дальше. Ничего страшного не будет.
Дальше вы создаете @res. Это массив. При return @res он будет скопирован, а потом изначальный массив будет удален (тут могу ошибаться, так как сюда прямо просится оптимизация, возможно она уже есть). Когда вы будете принимать ответ вы напишите или:
@result = your_sub_with_foreach() или ($res1, $res2 ...) = your_sub();
В первом случае так-же будет копирование (уже 2е). Во втором - массив будет преобразован в список(немного виртуальный тип данных, который существует только в момент выполнения оператора) и из него будут выбраны первые n значений которые будут помещены в $res1, $res2 и т.д.

Для ухода от таких проблем достаточно заменить ваш return на return \@res в этом случае функция вернет ссылку на массив и принимающая сторона будет выглядеть так: my $res = your_sub(); $res->[0] - первый элемент массива. В этом случае копирований не будет (вернее будет, но только ссылок, что незначительно).
источник

SZ

Sergey Zhmylove in Modern::Perl
Warstone
Чтобы по простому... Не передавайте значений. Передавайте ссылки. Тогда точно не будет копирования.

В $ret вернули или скаляр или ссылку на хеш / массив (ссылка вообще так-же является скаляром, но размером ссылки можно пренебречь).
Его уже можно передавать дальше. Ничего страшного не будет.
Дальше вы создаете @res. Это массив. При return @res он будет скопирован, а потом изначальный массив будет удален (тут могу ошибаться, так как сюда прямо просится оптимизация, возможно она уже есть). Когда вы будете принимать ответ вы напишите или:
@result = your_sub_with_foreach() или ($res1, $res2 ...) = your_sub();
В первом случае так-же будет копирование (уже 2е). Во втором - массив будет преобразован в список(немного виртуальный тип данных, который существует только в момент выполнения оператора) и из него будут выбраны первые n значений которые будут помещены в $res1, $res2 и т.д.

Для ухода от таких проблем достаточно заменить ваш return на return \@res в этом случае функция вернет ссылку на массив и принимающая сторона будет выглядеть так: my $res = your_sub(); $res->[0] - первый элемент массива. В этом случае копирований не будет (вернее будет, но только ссылок, что незначительно).
В перл всё передается по ссылке
источник

SZ

Sergey Zhmylove in Modern::Perl
Vyacheslav Olkhovchenkov
ну и? до него (потребителя) содержимое по ссылкам доедет? не просрется не перезапишется чем-то еще?
Доедет
источник

W

Warstone in Modern::Perl
Sergey Zhmylove
В перл всё передается по ссылке
Замерьте сколько у вас есть памяти. Создайте массив из одной строки так чтобы 2/3 памяти было съедено, а потом сделайте return @arr
источник

W

Warstone in Modern::Perl
Ну и примите его с другой стороны в @arr2 ессно
источник

W

Warstone in Modern::Perl
Хотя нет... Тут может прокатить из-за CoW на строке
источник

DS

Dmitriy Shamatrin in Modern::Perl
my $v = 0;
print $v, "\n";
mysub($v);
print $v, "\n";
sub mysub {
   $_[0]++;
}
источник

DS

Dmitriy Shamatrin in Modern::Perl
0
1
источник

VO

Vyacheslav Olkhovche... in Modern::Perl
в любом случае в моем пример 'xxx' -- маленькая строка, гинабйты -- они в $ret->{value}
источник

АП

Александр Поволоцкий... in Modern::Perl
Здесь есть человек, которого осмысленно спросить про OAuth об Гугла?
источник

SZ

Sergey Zhmylove in Modern::Perl
Warstone
Ну и примите его с другой стороны в @arr2 ессно
Это не ессно, т.к. именно в момент «принятия» оно начнет жрать. А вот если я это приму в print length for func() то не вижу проблем
источник

VO

Vyacheslav Olkhovche... in Modern::Perl
что-то у меня полное впечетление что Net::Amazon::S3 -- не тред-сайф
источник

OP

Oleg Pronin in Modern::Perl
Память из под sv не освобождаетсяв систему. Из под самих sv (скруткур). Память из под строк, массивов (то есть массив указателей), бакетов в хеше и прочих вспомогательных аллокиций - еще как отдается назад
источник

OP

Oleg Pronin in Modern::Perl
Потому что все это не на арене вделялось а через маллок
источник

W

Warstone in Modern::Perl
Dmitriy Shamatrin
my $v = 0;
print $v, "\n";
mysub($v);
print $v, "\n";
sub mysub {
   $_[0]++;
}
И что? Я про массивы вы про скаляры...
источник