Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #19009

Re: addresses of variables

From Stephen Sprunk <stephen@sprunk.org>
Newsgroups comp.lang.c
Subject Re: addresses of variables
Date 2012-03-24 16:09 -0500
Organization A noiseless patient Spider
Message-ID <jkld5d$jad$1@dont-email.me> (permalink)
References (10 earlier) <jkdmek$bit$1@dont-email.me> <jkdrfv$bos$1@dont-email.me> <jkeb80$dko$1@dont-email.me> <jkeuhe$3df$1@dont-email.me> <yoidnfL0u6RC0fbSnZ2dnUVZ_r6dnZ2d@bestweb.net>

Show all headers | View raw


On 22-Mar-12 11:01, Kenneth Brody wrote:
> On 3/22/2012 6:22 AM, James Kuyper wrote:
>> On 03/22/2012 12:53 AM, Stephen Sprunk wrote:
>>> Concrete example:
>>>
>>> int quux(void)
>>> {
>>>    int foo = 42;
>>>    int *bar =&foo;
>>>    return foo;
>>> }
>>>
>>> 1. Both foo and bar start out in memory.
>>> 2. foo can't be migrated to a register because of the&foo.
>>> 3. bar is eliminated via dead code elimination.
>>> 4. foo can now be migrated to a register.
>>> 5. No address is needed for either foo or bar.
>>
>> A prime example of a situation where neither foo, nor bar, nor the
>> address of foo, are needed.
> 
> In fact, foo itself becomes unnecessary.  My compiler optimizes this to
> the equivalent of "return 42;".

True in theory, but every implementation I'm familiar with passes the
return value in a register, so the output is the same whether the
compiler eliminates foo or not.

>>> OTOH, say you have this:
>>>
>>> #include<stdio.h>
>>> int quux(void)
>>> {
>>>    int foo = 42;
>>>    int *bar =&foo;
>>>    printf("%p\n", (void*)bar);
>>>    return foo;
>>> }
>>>
>>> 1. Both foo and bar start out in memory.
>>> 2. foo can't be migrated to a register because of the&foo.
>>> 3. bar is migrated to a register.
>>> 4. An address is needed for foo but not for bar.
>>>
>>> Can you give a similar example for what you're describing--and your
>>> mental model of what a compiler would do with it?
>>
>> Yes, the second case you've just given fits what I'm talking about
>> exactly. Having recognized that there's absolutely no need to store 42
>> anywhere, the compiler reserves an arbitrary address for foo, but never
>> bothers storing anything at that address. That address is stored in a
> 
> Note that this is only due to the "special knowledge" that the compiler
> may have for the printf() function.  Had the line been this:
> 
>     plugh("%p\n", (void *)bar);
> 
> instead, then the assumption that the address will never be dereferenced
> would be invalid, and the 42 must be stored there.

Exactly my point.

> Note, however, that even with the plugh() call, my compiler has still
> eliminated bar entirely, and simply passes &foo directly.  (In both
> cases, however, my compiler stores the 42.)

Good point; I was thinking of systems where arguments are passed in
registers or must be in a register to be pushed onto the stack.  If
neither of those applies, bar can be eliminated.

S

-- 
Stephen Sprunk         "God does not play dice."  --Albert Einstein
CCIE #3723         "God is an inveterate gambler, and He throws the
K5SSS        dice at every possible opportunity." --Stephen Hawking

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

addresses of variables Zero <chefmuetze@web.de> - 2012-03-18 03:56 -0700
  Re: addresses of variables "BartC" <bc@freeuk.com> - 2012-03-18 11:18 +0000
  Re: addresses of variables jt@toerring.de (Jens Thoms Toerring) - 2012-03-18 11:18 +0000
  Re: addresses of variables pete <pfiland@mindspring.com> - 2012-03-18 07:30 -0500
    Re: addresses of variables Zero <chefmuetze@web.de> - 2012-03-18 04:42 -0700
      Re: addresses of variables Lowell Gilbert <lgusenet@be-well.ilk.org> - 2012-03-19 10:52 -0400
        Re: addresses of variables Stephen Sprunk <stephen@sprunk.org> - 2012-03-19 12:55 -0500
          Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-19 14:30 -0400
            Re: addresses of variables jacob navia <jacob@spamsink.net> - 2012-03-19 20:11 +0100
              Re: addresses of variables hoganlong@gmail.com - 2012-03-19 12:17 -0700
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-19 16:15 -0400
                Re: addresses of variables hoganlong@gmail.com - 2012-03-19 14:18 -0700
                Re: addresses of variables "io_x" <a@b.c.invalid> - 2012-03-19 23:26 +0100
            Re: addresses of variables Stephen Sprunk <stephen@sprunk.org> - 2012-03-20 03:52 -0500
              Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-20 06:00 -0400
                Re: addresses of variables Stephen Sprunk <stephen@sprunk.org> - 2012-03-20 16:47 -0500
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-20 18:37 -0400
                Re: addresses of variables Stephen Sprunk <stephen@sprunk.org> - 2012-03-21 17:58 -0500
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-21 20:24 -0400
                Re: addresses of variables Stephen Sprunk <stephen@sprunk.org> - 2012-03-21 23:53 -0500
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-22 06:22 -0400
                Re: addresses of variables Kenneth Brody <kenbrody@spamcop.net> - 2012-03-22 12:01 -0400
                Re: addresses of variables Stephen Sprunk <stephen@sprunk.org> - 2012-03-24 16:09 -0500
                Re: addresses of variables Jens Gustedt <jens.gustedt@loria.fr> - 2012-03-23 13:41 +0100
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-23 09:06 -0400
                Re: addresses of variables Jens Gustedt <jens.gustedt@loria.fr> - 2012-03-23 19:47 +0100
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-23 16:04 -0400
                Re: addresses of variables Jens Gustedt <jens.gustedt@loria.fr> - 2012-03-24 00:19 +0100
                Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-23 22:20 -0400
                Re: addresses of variables Jens Gustedt <jens.gustedt@loria.fr> - 2012-03-24 09:39 +0100
            Re: addresses of variables Anders Wegge Keller <wegge@wegge.dk> - 2012-03-20 20:02 +0100
              Re: addresses of variables James Kuyper <jameskuyper@verizon.net> - 2012-03-20 15:18 -0400
                Re: addresses of variables Anders Wegge Keller <wegge@wegge.dk> - 2012-03-21 21:37 +0100
          Re: addresses of variables Lowell Gilbert <lgusenet@be-well.ilk.org> - 2012-03-20 11:52 -0400
            Re: addresses of variables Kenneth Brody <kenbrody@spamcop.net> - 2012-03-21 11:04 -0400

csiph-web