in reply to Re^3: Bit vector fiddling with Inline C
in thread Bit vector fiddling with Inline C
Thanks so much - that's incredibly helpful, and exactly the kind of feedback I was looking for. It's reassuring to know that my approach isn't likely to break anything (noting your caveat about UTF data).
I see one of the earlier responses above (also v helpful) raises the question of pass-by-value/reference. My understanding is that with a scalar parameter, Perl normally passes by value (ie. a copy goes onto the stack) whereas in C, strings are always passed around by reference.
I would assume from my example in the OP that the C world 'wins out' here and the $vector is passed to the C function by reference (even though it's called in Perl with $vector rather than \$vector)? I'm assuming that because changing it in C also changes the original scalar back in Perl.
That becomes important if $vector happens to be huge - it would otherwise be memcopied as part of the call (which I think is one of the points anonymized user 468275 raises about efficiency).
I don't suppose your knowledge of the internals can confirm that the example in the OP is indeed just passing a pointer to $vector, and NOT copying the entire byte sequence somewhere else at the same time (even just as a side-effect)?
Update: After some further tests, this is a duff question. Even in pure Perl, calling a function with a very large scalar as a parameter does not immediately take up twice the memory by copying the variable. (I think that's because an alias to the variable is put onto @_, although I may be wrong?) The 'double the memory' effect only happens if, inside your function, you then assign it to another variable with something like 'my $var = shift'.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^5: Bit vector fiddling with Inline C
by BrowserUk (Patriarch) on May 09, 2011 at 19:22 UTC | |
by oxone (Friar) on May 09, 2011 at 21:54 UTC | |
by syphilis (Archbishop) on May 10, 2011 at 02:12 UTC | |
by BrowserUk (Patriarch) on May 10, 2011 at 07:06 UTC | |
by syphilis (Archbishop) on May 10, 2011 at 23:45 UTC | |
| |
by oxone (Friar) on May 10, 2011 at 08:11 UTC | |
| |
by oxone (Friar) on May 10, 2011 at 05:56 UTC |