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


Groups > comp.lang.c > #21467

Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc.

From Johannes Bauer <dfnsonfsduifb@gmx.de>
Newsgroups comp.lang.c
Subject Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc.
Date 2012-05-28 14:54 +0200
Organization albasani.net
Message-ID <jpvsgl$tul$1@news.albasani.net> (permalink)
References <d8247fad-17c7-4105-82c1-364f00dac222@p27g2000vbl.googlegroups.com> <jpu19n$bm5$1@news.belwue.de>

Show all headers | View raw


On 27.05.2012 22:03, Thomas Richter wrote:

>> Example1
>> ========
>>
>> Variant 1a)
>>
>> arr[i].a = f1();
>> arr[i].b = f2();
>> arr[i].c = f3();
>>
>> OR
>>
>> Variant 1b)
>>
>> struct tmp * const pArr =&arr[i]; // arr + i
>> pArr->a = f1();
>> pArr->b = f2();
>> pArr->c = f3();
>
> Frankly, I believe any decent compiler will likely generate identical
> code for both cases.

Just for fun I tried this out on x86-64 Linux with gcc 4.6.2 (knowing
full well this is a *language* group, but oh well...).

Fun fact: 1a) for my constellation produces *faster* code than 1b)! Very
cool. If you look at the assembly of 1a)

  400512:	48 81 ec 08 10 00 00 	sub    $0x1008,%rsp
  400519:	48 8d 5c 24 04       	lea    0x4(%rsp),%rbx
  40051e:	48 8d ac 24 04 10 00 	lea    0x1004(%rsp),%rbp
  400525:	00

Loop:
  400526:	e8 2f 01 00 00       	callq  40065a <f1>
  40052b:	89 03                	mov    %eax,(%rbx)
  40052d:	e8 2e 01 00 00       	callq  400660 <f2>
  400532:	89 43 04             	mov    %eax,0x4(%rbx)
  400535:	e8 2c 01 00 00       	callq  400666 <f3>
  40053a:	89 43 08             	mov    %eax,0x8(%rbx)
  40053d:	48 83 c3 20          	add    $0x20,%rbx
  400541:	48 39 eb             	cmp    %rbp,%rbx
  400544:	75 e0                	jne    400526 <main+0x16>

and compare against 1b)

  400512:	48 81 ec 08 10 00 00 	sub    $0x1008,%rsp
  400519:	31 db                	xor    %ebx,%ebx

Loop:
  40051b:	48 89 dd             	mov    %rbx,%rbp
  40051e:	48 c1 e5 05          	shl    $0x5,%rbp
  400522:	48 8d 04 24          	lea    (%rsp),%rax
  400526:	48 01 c5             	add    %rax,%rbp
  400529:	e8 34 01 00 00       	callq  400662 <f1>
  40052e:	89 45 04             	mov    %eax,0x4(%rbp)
  400531:	e8 32 01 00 00       	callq  400668 <f2>
  400536:	89 45 08             	mov    %eax,0x8(%rbp)
  400539:	e8 30 01 00 00       	callq  40066e <f3>
  40053e:	89 45 0c             	mov    %eax,0xc(%rbp)
  400541:	48 83 c3 01          	add    $0x1,%rbx
  400545:	48 81 fb 80 00 00 00 	cmp    $0x80,%rbx
  40054c:	75 cd                	jne    40051b <main+0xb>

I.e. variant 1a) does a load effective address once and increments by
the size of the struct each time, using the dispacement to assign the
values to the struct members.

Variant 2a) counts through 0...(n-1) and does a LEA *each* iteration.

Very cool result IMO (especially since it nicely reinforces the point
that "optimizing" code thinking it will run faster is a stupid idea
without knowing *exactly* what happens).

Best regards,
Joe

-- 
>> Wo hattest Du das Beben nochmal GENAU vorhergesagt?
> Zumindest nicht öffentlich!
Ah, der neueste und bis heute genialste Streich unsere großen
Kosmologen: Die Geheim-Vorhersage.
 - Karl Kaos über Rüdiger Thomas in dsa <hidbv3$om2$1@speranza.aioe.org>

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


Thread

Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. John Reye <jononanon@googlemail.com> - 2012-05-27 10:30 -0700
  Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. John Reye <jononanon@googlemail.com> - 2012-05-27 10:35 -0700
    Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. pete <pfiland@mindspring.com> - 2012-05-27 14:11 -0400
  Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-05-27 14:01 -0400
    Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. pete <pfiland@mindspring.com> - 2012-05-27 14:20 -0400
  Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. Thomas Richter <thor@math.tu-berlin.de> - 2012-05-27 22:03 +0200
    Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. Johannes Bauer <dfnsonfsduifb@gmx.de> - 2012-05-28 14:54 +0200
  Re: Array addressing styles: arr[i].d[j] versus pArr->d[j], etc. Tim Rentsch <txr@alumni.caltech.edu> - 2012-05-31 13:09 -0700

csiph-web