mikrocontroller.net

Forum: Compiler & IDEs Indizes statt Pointer


Autor: void (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich stelle fest, dass Pointer neben dem ggf. höheren Speicherbedarf (16 
bit statt z.B. ein 8 bit Index) auch durch die notwendige Arithmetik für 
den Zugriff auf Listen eigentlich keinen Vorteil bringen.

Wie sieht das der GCC?

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einem eimaligem zugriff hast du recht. Wenn du öfters auf dein Array 
zugreifst ist die Pointer aretmetik sicherlich schneller, da weniger 
Rechenoperationen.
Desweiteren kommt es immer noch auf die Plattform an. (Brite von Daten 
und Adressen, seperate Adress-ALU, HW-Multipliziere, etc.)

Eine pauschale Aussage ist nicht möglich!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie sieht das der GCC?

Für den gcc, wie für alle anderen C-Compiler auch, ist ein Pointer ein 
Pointer, und ein Index ein Index.

>16 bit statt z.B. ein 8 bit Index

Hmm. Und was ist bei mehr als 255 Listenelementen? Auf 
32-Bit-Architekturen? Bei dynamischen Listen?

Alles nicht so einfach...

Oliver

Autor: void (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhh, macht er nicht aus dem Index einen Pointer, wenn er den Index auf 
die Startadresse addiert?
Ist irgendwo dokumentiert, wie der GCC mit Arrays und ihren Indizes 
umspringt? Interessiert mich.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Assemblerausgabe.
Mir fällt gerade der Compilerschalter nicht ein.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann durchaus passieren, dass der Compiler zur Schleifenoptimierung 
zusätzlich oder alternativ zum laufenden Index einen Pointer mitzieht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void schrieb:
> Mhh, macht er nicht aus dem Index einen Pointer, wenn er den Index auf
> die Startadresse addiert?
> Ist irgendwo dokumentiert, wie der GCC mit Arrays und ihren Indizes
> umspringt? Interessiert mich.

Wahrscheinlich so, wie der C-Standard dies vorsieht.

Er behandelt

    a[i]

so, als ob du  *(a+i)  geschrieben hättest.

Autor: Bernd O. (bitshifter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> void schrieb:
>> Mhh, macht er nicht aus dem Index einen Pointer, wenn er den Index auf
>> die Startadresse addiert?
>> Ist irgendwo dokumentiert, wie der GCC mit Arrays und ihren Indizes
>> umspringt? Interessiert mich.
>
> Wahrscheinlich so, wie der C-Standard dies vorsieht.
>
> Er behandelt
>
>     a[i]
>
> so, als ob du  *(a+i)  geschrieben hättest.
War's nicht eher *(a+(i*sizeof(a[0])))

Gruß,
Bernd

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd O. schrieb:
> Karl heinz Buchegger schrieb:
>> Er behandelt a[i]
>> so, als ob du  *(a+i)  geschrieben hättest.
> War's nicht eher *(a+(i*sizeof(a[0])))

Nein, dieser Code ist nicht identisch mit a[i]. Der C Standard legt 
fest, dass a[i] identisch mit *(a + i) ist. Wenn ein Pointer und ein 
Integer addiert (oder subtrahiert) werden, dann wird der Integer 
implizit mit sizeof(*a) multipliziert.

Das hatten wir heute schon einmal in 
Beitrag "*(byMessage + i) identisch byMessage[i]" durch. ;)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bernd O.:

nein.

Zum letzten Mal: a[i] ist gleichbedeutend mit *(a+i) ist
gleichbedeutend mit *(i+a) ist gleichbedeutend mit i[a].

Implizit wird dann i mit der Größe von *a multipliziert,
nicht mehr auf Quelltextebene.

Also ist die Gleichsetzung von a[i] mit *(a+(i*sizeof(a[0])))
einfach FALSCH.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd O. schrieb:

>> Er behandelt
>>
>>     a[i]
>>
>> so, als ob du  *(a+i)  geschrieben hättest.
> War's nicht eher *(a+(i*sizeof(a[0])))

Du meinst eher

    * (typeof(*a)*)( ((char*)a) + ( i * sizeof(*a) ) )

Dann stimmt es (wenn ich mal so frei sein darf und einen Operator typeof 
postulieren darf), da sizeof(char) per Definition 1 ist. Aber ansonsten 
steckt die implizite Multiplikation mit dem sizeof schon im Datentyp des 
Pointers mit drinnen. -> Pointerarithmetik. Und die hat nichts mit 
dieser Äquivalenz zu tun.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.