C Programming Style

Scott Pace scott at othervax.UUCP
Fri Jul 26 01:11:58 AEST 1985


Here is one (more?) reason to use assignments inside of conditional
statments which will especially appeal to those of you who like
efficiency in your code! (I hope this hasn't been mentioned before).


Consider the following piece of code:


int a,fp;

main()
{
    if ( (fp = open("foo",0)) < 0 )
	a = 1;
    fp = open("foo",0);
    if (fp < 0)
	a = 1;
}

Now, when this is compiled (VAX 780,4.1BSD) using the -S and -O
flags, the following assembly code is produced:
(the comments were added by me of course!!!)


.data
.comm	_a,4		;the 'a' variable
.comm	_fp,4		;the 'fp' variable
.text
LL0:.align	1
.globl	_main
.data	1
L19:.ascii	"foo\0"
.text
.data	1
L21:.ascii	"foo\0"
.text
.set	L14,0x0
.data
.text
_main:.word	L14
pushl	$0		;push the second (last) parameter to open
pushal	L19		;push the first parameter to open
calls	$2,_open	;call to open
movl	r0,_fp		;put returned value in fp (also setting cond. flags)
jgeq	L20		;do the 'if' part
movl	$1,_a		;a = 1 if fp < 0
L20:pushl	$0	;push the second (last) parameter to open
pushal	L21		;push the first parameter to open
calls	$2,_open	;call to open
movl	r0,_fp		;put returned value in fp (also setting cond. flags)
tstl	r0		;set the cond. flags again!!! - redundant instruction
jgeq	L22		;do the 'if' part
movl	$1,_a		;a = 1 if fp < 0
L22:ret			;exit


So we can see from this that the compiler produces more efficient
code when assignments are contained within a conditional such as
the 'if' statment.
It should be noted, however, that this is only one simple example
and that the above observation may not hold true in all cases.

Now, in this case one extra instruction isn't going to make any
difference but there may be other cases where the 'if' statment
is inside a loop and the loop body is executed thousands of times.
This extra instruction could mean a few extra seconds (or more!)
which may be critical in certain applications.

One final note, the compiler does NOT generate the extra instruction
when fp is declared as a register variable. It doesn't matter if
fp is declared auto or static or extern, all these types generate
the extra instruction except for a register declaration.

What we need is a good optimizer!!! (do I get a prize for stating
the obvious??!!)

Scott Pace,

	Philips Info. Sys. Ltd., Montreal.

	...!philabs!micomvax!othervax!scott



More information about the Comp.lang.c mailing list