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


von Nixwisser (Gast)


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.

von Peter (Gast)


Lesenswert?

einen const zeiger währe dafür genau richtig

von Peter (Gast)


Lesenswert?

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

von Nixwisser (Gast)


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?

von Peter (Gast)


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.

von Nixwisser (Gast)


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?

von Peter (Gast)


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.

von Johann (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.