Waste of space for local initialized character data
Mike Laman
laman at sdcsvax.UUCP
Thu Aug 9 07:53:53 AEST 1984
The following two functions show a "trivial" problem with the 4.2BSD compiler
wasting space on the frame for the local variables. The first function
allocates 4 bytes on the stack for local data, but the second function, "bug",
allocates 8 bytes on the stack for local data. The compiler is consistent in
data access, so there is no REAL bug; just a waste of stack space.
good() {
char a, b;
a = 'a'; b = 'b'; /* Show where each local variable is on the frame */
}
bug() {
char a = 0, b;
a = 'a'; b = 'b'; /* Show where each local variable is on the frame */
}
This is the beautified assembly output:
.text
.align 1
.globl _good
_good: .word 0x0
subl2 $4,sp
movb $97,-1(fp)
movb $98,-2(fp)
ret
.align 1
.globl _bug
_bug: .word 0x0
subl2 $8,sp
# Opps. Why are 8 bytes reserved? Notice below that the first one
# is the only variable in the first word. Some how the internal
# location counter got rounded up to a word boundary by the
# initialization.
clrb -1(fp)
movb $97,-1(fp)
movb $98,-5(fp)
ret
End of assembly.
I thought I would point this out to the network. I'm not going to lose any
sleep over it, as I'm sure others won't. Who knows, maybe someone will
fix this up. I would think that this is closely tied to the initialization
of global data, where global characters are allocated the same way.
The waste of stack space may be in other compiler versions, too.
Mike Laman
UUCP: {ucbvax,philabs,sdccsu3,sdcsla}!sdcsvax!laman
More information about the Net.bugs
mailing list