Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| 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> |
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
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