Ye Olde Register Variable Hacke
John Sambrook
john at amc-gw.amc.com
Wed Nov 28 17:21:15 AEST 1990
In article <9733:Nov2722:02:3090 at kramden.acf.nyu.edu> brnstnd at kramden.acf.nyu.edu (Dan Bernstein) writes:
>
>Sure. And it *could* also result in much better code. What most of us
>are saying is that in practice extra register declarations help much
>more than they hurt. In typical programs, some variables are used quite
>a lot, and they should be declared register. Some variables are rarely
>used, and they shouldn't be declared register. It's better to err on the
>side of extra register declarations than to pessimize your code in the
>common case. Past that, who cares? The language doesn't provide better
>mechanisms for asserting variable use, so you won't be able to outguess
>the compiler in very many cases.
>
>---Dan
Maybe not everyone knows about the following hack. I didn't invent
it, but learned about it on a past project and thought I'd share it.
But before we get started, let's all remember that what follows is a
hack, and no one is recommending that you use it. I'd only use it
under the most dire of circumstances, and only then after sending the
FSF a check for $ 50.00 to support work on good free compilers like
GCC.
Let's say you have a large software system and you are forced to use
inferior C compilers to compile your system. Inferior compiler #1
honors the first two register declarations that it encounters while
inferior compiler #2 honors the first five. You could do something
like this:
1. Put the following code in the "global" include file that your system
no doubt already includes:
#if C_COMPILER == INFERIOR_COMPILER_1
#define register_1 register
#define register_2 register
#define register_3
#define register_4
...
#define register_9
#endif
#if C_COMPILER == INFERIOR_COMPILER_2
#define register_1 register
#define register_2 register
#define register_3 register
#define register_4 register
#define register_5 register
#define register_6
#define register_7
...
#define register_9
#endif
2. Next spend hours tweaking your code so that in each function
register declarations are prioritized according to your guesses
about variable usage. The most important variable in the function
is declared as 'register_1 ...' while the least important register
variable is assigned 'register_9 ...'.
I actually worked on a project (a UNIX-hosted interpreter for Wang
BASIC-2) where doing this made some difference in performance. But a
better compiler would have probably made a bigger difference, and we
didn't wind up doing this thoughout the code. Better algorithms no
doubt would have made the biggest difference.
--
John Sambrook DNS: john at amc.com
Applied Microsystems Corporation UUCP: amc-gw!john
Redmond, Washington 98073 Dial: (206) 882-2000 ext. 630
More information about the Comp.lang.c
mailing list