Weird.
There shouldn't be any performance penalty to reading an OOK ("beheaded") scalar. Rather than adding an offset each time the string it accessed, the pointer to the string is changed to point beyond the "head" when the string is "beheaded".
use Devel::Peek qw( Dump );
my $s = "abcdef";
$s .= "g"; # Trigger COW
Dump( $s );
substr( $s, 0, 1, "" );
Dump( $s );
SV = PV(0x59d752a54ee0) at 0x59d752a830d0
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x59d752a6b2e0 "abcdefg"\0
CUR = 7
LEN = 16
SV = PV(0x59d752a54ee0) at 0x59d752a830d0
REFCNT = 1
FLAGS = (POK,OOK,pPOK)
OFFSET = 1
PV = 0x59d752a6b2e1 ( "\x01" . ) "bcdefg"\0
CUR = 6
LEN = 15
Before the beheading, the string started at 0x59d752a6b2e0 and used 7 bytes of 16.
After the beheading, the string started at 0x59d752a6b2e1 and used 6 bytes of 15.
In both cases, the same memory block starting at 0x59d752a6b2e0 is used. But because the PV, CUR and LEN fields were adjusted, reading from the scalar is identical whether it's an OOK ("beheaded") scalar or not.
|