Inlining Constant Functions
Functions prototyped with (),
meaning that they take no arguments at all, are parsed like the
time built-in. More
interestingly, the compiler treats such functions as potential
candidates for inlining. If the result of that function, after
Perl’s optimization and constant-folding pass, is either a constant
or a lexically scoped scalar with no other references, then that
value will be used in place of calls to that function. Calls made
using &NAME are
never inlined, however, just as they are not subject to any other
prototype effects. (See the constant pragma in Chapter 29 for an easy way
to declare such constants.)
Both versions of these functions to compute π will be inlined by the compiler:
sub pi () { 3.14159 } # Not exact, but close
sub PI () { 4 * atan2(1, 1) } # As good as it getsIn fact, all of the following functions are inlined because Perl can determine everything at compile time:
sub FLAG_FOO () { 1 << 8 }
sub FLAG_BAR () { 1 << 9 }
sub FLAG_MASK () { FLAG_FOO | FLAG_BAR }
sub OPT_GLARCH () { (0x1B58 & FLAG_MASK) == 0 }
sub GLARCH_VAL () {
if (OPT_GLARCH) { return 23 }
else { return 42 }
}
sub N () { int(GLARCH_VAL) / 3 }
BEGIN { # compiler runs this block at compile time
my $prod = 1; # persistent, private variable
for (1 .. N) { $prod *= $_ }
sub NFACT () { $prod }
}In the last example, the NFACT function is inlined because it has a void prototype and the variable it returns is not changed by that function; furthermore, it can’t be changed by ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access