mikrocontroller.net

Forum: Compiler & IDEs Kopie oder Zeiger auf Struktur übergeben?


Autor: Nixwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in einer Funktion foo wird eine lokale Struktur mit Werten gefüllt. 
Danach folgt ein switch-case mit mehreren Unterfunktionen, die alle die 
Daten aus der Struktur benötigen (nur Lesezugriff). Würdet ihr eine 
Kopie der Struktur oder einen Zeiger auf die Struktur übergeben?

Danke schonmal.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einen const zeiger währe dafür genau richtig

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder sogar eine const Referenz, aber leider steht nicht da ob c oder c++

Autor: Nixwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es handelt sich um C.

Welchen Unterschied macht in diesem Fall ein const-Zeiger gegenüber 
einem normalen? Dass die Strukt-Member nicht verändert werden dürfen 
oder dass immer der selbe Zeiger übergeben werden muss?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
const verhindert bloss damit man nicht den inhalt ändern - wenn man es 
aber drauf anlegt geht es trozdem.
Wenn man eine Funktion mit const sieht was man gleich das hier das 
inhalt nicht geändert wird, man also keine Kopie machen muss.

Autor: Nixwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn man eine Funktion mit const sieht was man gleich das hier das
>inhalt nicht geändert wird, man also keine Kopie machen muss.

Was meinst du mit Kopie machen? Eine Kopie innerhalb der aufrufenden 
Funktion, damit nichts überschrieben wird?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein von Aussen

wenn ich in der Doku nur sehe

void func1( const void* p );

dann weiss ich das sie in meinem p nichts ändern, wenn ich aber bloss

void func2( void* p );

sehe, muss ich damit rechnen das sie Änderrungen an p vornehmen (wenn 
nichts weiter in der doku steht) also müsste man aus sicherheitsgründen 
eine Kopie machen vorher machen.

Aber in C wurde das const ja auch erst später eingeführt, in c++ mit 
Objekten ist es sehr hilfreich wenn man gleich sieht es ein Objekt nicht 
verändert wird.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ganz allgemein kann man das nicht sagen.

Für große Komposite (Struct, Union, ...) ist es auf jeden Fall besser, 
per Zeiger/Referenz auf sie zuzugreifen, da ansonsten die kompletten 
Daten kopiert werden mussen.

Ausserdem kann eine Aussage nicht allgemeingültig für alle 
GCC-Ausprägungen gegeben werden, weil die Parameterübergabe abhängig von 
der ABI ist. Zudem ist es nicht unwesentlich wie viele GPRs es auf der 
Maschine gibt, für die übersetzt wird.

Für AVR ist es zB günstiger, Komposite mit 1, 2, und 4 Byte Größe (evtl. 
auch 8 Byte) direkt zu übergeben. Das spart die Speicherzugriffe, die 
ansonsten entstehen, weil man über den übergebenen Zeiger oder die 
implizite übergeben Referenz auf die Daten zugreift.

Diese kleinen Komposite kann avr-gcc in Registern abhandelt, während es 
für 6-Byte Größe nicht geht; eine solche Struktur mit "krummer" 
Byte-Anzahl zu übergeben wird dazu führen, daß GCC sie im Frame anlegt, 
d.h. er wird dann immer Speicherzugriffe machen müssen.

Um ein Gefühl dafür zu bekommen kann es durchaus lohnend sein, ein Blick 
aufs erzeugte asm zu werfen.

Grüß, Johann

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.