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.
Oder sogar eine const Referenz, aber leider steht nicht da ob c oder c++
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?
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.
>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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.