File: size_matters.pod

package info (click to toggle)
libapache2-mod-perl2 2.0.9~1624218-2%2Bdeb8u2
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 11,912 kB
  • ctags: 4,588
  • sloc: perl: 95,064; ansic: 14,527; makefile: 49; sh: 18
file content (211 lines) | stat: -rw-r--r-- 5,292 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
=head1 NAME

Measure sizeof() of Perl's C Structures

=head1 Description

This document describes the I<sizeof> various structures, as
determined by I<util/sizeof.pl>.  These measurements are mainly for
research purposes into making Perl things smaller, or rather, how to
use less Perl things.

=head1 Perl Structures

Structures diagrams are courtesy gdb (print pretty) and a bit of hand crafting.

=over 4

=item CV - 229 minimum, 254 minimum w/ symbol table entry

  cv = {
     sv_any = {        // XPVCV *
         xpv_pv = 0x0, // char *
         xpv_cur = 0,  // STRLEN
         xpv_len = 0,  // STRLEN
         xof_off = 0 , // IV
         xnv_nv = 0,   // NV
         xmg_magic = 0x0, // MAGIC *
         xmg_stash = 0x0, // HV *
         xcv_stash = 0x0, // HV *
         xcv_start = 0x0, // OP *
         xcv_root = 0x0,  // OP *
         xcv_xsub = 0x0,  // void (*)(register PerlInterpreter *, CV *)
         xcv_xsubany = {  // ANY
             any_ptr = 0x0,
             any_i32 = 0,
             any_iv = 0,
             any_long = 0,
             any_dptr = 0,
             any_dxptr = 0
         },
         xcv_gv = { // GV *
             sv_any = { // void *
                 xpv_pv = 0x0, // char *
                 xpv_cur = 0,  // STRLEN
                 xpv_len = 0,  // STRLEN
                 xiv_iv = 0,   // IV
                 xnv_nv = 0,   // NV
                 xmg_magic =  { // MAGIC *
                     mg_moremagic = 0x0, // MAGIC *
                     mg_virtual = 0x0,   // MGVTBL *
                     mg_private = 0,     // U16
                     mg_type = 0,        // char
                     mg_flags = 0,       // U8
                     mg_obj = 0x0,       // SV *
                     mg_ptr = 0x0,       // char *
                     mg_len = 0,         // I32
                 },
                 xmg_stash = 0x0, // HV *
                 xgv_gp = { // GP *
                     gp_sv = { // SV *
                         sv_any = 0x0,  // void *
                         sv_refcnt = 0, // U32
                         sv_flags = 0   // U32
                     },
                     gp_refcnt = 0, // U32
                     gp_io = 0x0,   // struct io *
                     gp_form = 0x0, // CV *
                     gp_av = 0x0,   // AV *
                     gp_hv = 0x0,   // HV *
                     gp_egv = 0x0,  // GV *
                     gp_cv = 0x0,   // CV *
                     gp_cvgen = 0,  // U32
                     gp_flags = 0,  // U32
                     gp_line = 0,   // line_t
                     gp_file = 0x0, // char *
                 },
                 xgv_name = 0x0,  // char *
                 xgv_namelen = 0, // STRLEN
                 xgv_stash = 0x0, // void *
                 xgv_flags = 0,   // U8
             },
             sv_refcnt = 0, // U32
             sv_flags = 0,  // U32
         },
         xcv_file = 0x0, // char *
         xcv_depth = 0, // long
         xcv_padlist = 0x0, // AV *
         xcv_outside = 0x0, // CV *
         xcv_flags = 0, // cv_flags_t
     }
     sv_refcnt = 0, // U32
     sv_flags = 0,  // U32
  };

In addition to the minimum bytes:

=over 4

=item name of the subroutine: GvNAMELEN(CvGV(cv))+1

=item symbol table entry: HvENTRY (25 + GvNAMELEN(CvGV(cv))+1)

=item minimum sizeof(AV) * 3: xcv_padlist if !CvXSUB(cv)

=item CvROOT(cv) optree

=back

=item HV - 60 minmum

  hv = {
     sv_any = { // SV *
         xhv_array = 0x0,  // char *
         xhv_fill = 0,     // STRLEN
         xhv_max = 0,      // STRLEN
         xhv_keys = 0,     // IV
         xnv_nv = 0,       // NV
         xmg_magic = 0x0,  // MAGIC *
         xmg_stash = 0x0,  // HV *
         xhv_riter = 0,    // I32
         xhv_eiter = 0x0,  // HE *
         xhv_pmroot = 0x0, // PMOP *
         xhv_name = 0x0    // char *
     },
     sv_refcnt = 0, // U32
     sv_flags = 0,  // U32
  };

Each entry adds C<sizeof(HvENTRY)>, minimum of 7 (initial C<xhv_max>).
Note that keys of the same value share C<sizeof(HEK)>, across all
hashes.

=item HvENTRY - 25 + HeKLEN+1

  sizeof(HE *) + sizeof(HE) + sizeof(HEK)

=item HE - 12

  he = {
     hent_next = 0x0, // HE *
     hent_hek = 0x0,  // HEK *
     hent_val = 0x0   // SV *
  };

=item HEK - 9 + hek_len

  hek = {
     hek_hash = 0, // U32
     hek_len = 0,  // I32
     hek_key = 0,  // char
  };

=item AV - 53

  av = {
     sv_any =  { // SV *
         xav_array = 0x0,  // char *
         xav_fill = 0,     // size_t
         xav_max = 0,      // size_t
         xof_off = 0,      // IV
         xnv_nv = 0,       // NV
         xmg_magic = 0x0,  // MAGIC *
         xmg_stash = 0x0,  // HV *
         xav_alloc = 0x0,  // SV **
         xav_arylen = 0x0, // SV *
         xav_flags = 0,    // U8
     },
     sv_refcnt = 0, // U32
     sv_flags = 0   // U32
  };

In addition to the minimum bytes:

=over 4

=item AvFILL(av) * sizeof(SV *)

=back

=back

=head1 SEE ALSO

perlguts(3), B::Size(3),

http://gisle.aas.no/perl/illguts/

=head1 Maintainers

Maintainer is the person(s) you should contact with updates,
corrections and patches.

=over

=item *

Doug MacEachern E<lt>dougm (at) covalent.netE<gt>

=back

=head1 Authors

=over

=item *

Doug MacEachern E<lt>dougm (at) covalent.netE<gt>

=back

=cut