Hallo, ich habe eine Beispielcode für eine Struktur in C# vorliegen. Den Aufbau der Struktur verstehe ich, jedoch hat die Struktur am Ende noch was (}XSTRUCT, *PXSTRUCT;) dranhängen, was ich nicht zuornen kann bzw. die Funktion dessen. Da alle Suchen nach "C# und struct" mir keine Hinweise gegeben habe, möchte ich hier im Forum fragen. Ich denke mal dass es eine Kleinigkeit ist, die ich nicht verstehe. typedef struct X_STRUCT { int a; int b; }XSTRUCT, *PXSTRUCT; Gruß C#Newbee
Das ist C und nicht C#. Das ist was komplett anderes. XSTRUCT wird als Alias zu "struct X_STRUCT" definiert. PXSTRUCT als Alias zu "struct X_STRUCT*". Letzteres hat man oft im unsäglichen Windows API gemacht, weil man irgendwie meinte, "PXSTRUCT" sei schöner als "XSTRUCT*", sodass uneingeweihte nicht sofort erkennen was gemeint ist. Macht man aber zum Glück nicht mehr.
Hallo Dr. Sommer, Danke, für die schnelle Antwort! Dr. Sommer schrieb: > XSTRUCT wird als Alias zu "struct X_STRUCT" definiert. > PXSTRUCT als Alias zu "struct X_STRUCT*". Verstehe ich das richtig, dass ich anstelle von "struct X_STRUCT" nur einfach "XSTRUCKT" schreiben kann, wenn ich beispielsweise dies an eine Funktion überge. "int fnExample(struct X_STRUCT);" ist gleichwertig mit "int fnExample(XSTRUCT);"? Gruss Newbee
C# Newbee schrieb: > Verstehe ich das richtig, Ja. Das typedef struct ist eine verkürzte Schreibweise - man könnte das typedef auch separat danach schreiben.
Da du gerade erst mit C# anfängst und nun schon C gefunden hast: Bleib bei C, da lernst du was vernünftiges.
C# Newbee schrieb: > Verstehe ich das richtig, dass ich anstelle von "struct X_STRUCT" nur > einfach "XSTRUCKT" schreiben kann, wenn ich beispielsweise dies an eine > Funktion überge. Bitte nur Zeiger oder Referenzen als Funktionsparameter verwenden ;) merciless
Dirk K. schrieb: > Bitte nur Zeiger oder Referenzen als > Funktionsparameter verwenden ;) Pauschale Regeln sind immer falsch. Ausreichend kleine structs können, wenn direkt übergeben, sogar effizienter sein als die Übergabe via Pointer/Referenz. Das hängt aber von der Plattform und ABI ab.
Dirk K. schrieb: > Kannst du das bitte näher spezifizieren? Ein struct welches nur 1 Element enthält, ist je nach ABI genauso effizient zu übergeben wie das Element selbst. Das ist bei Integern typischerweise eine Übergabe per Register. Auch mehrere Elemente können auf mehrere Register aufgeteilt übergeben werden. IIRC kann z.B. beim AAPCS ein struct mit 4x "int" direkt in den Registern r0-r3 übergeben werden, wenn es der einzige Parameter ist. Das erspart die Indirektion beim Aufrufer und beim aufgerufenen.
Und du meinst nicht, daß ein einigermaßen kompetenter Compiler das auch weiß, und anwendet? Oliver
Oliver S. schrieb: > Und du meinst nicht, daß ein einigermaßen kompetenter Compiler das > auch > weiß, und anwendet? Doch natürlich, aber eben nicht wenn man einen Pointer/Referenz verlangt, es sei denn die Funktion ist static und/oder inline.
Dr. Sommer schrieb: > Ein struct welches nur 1 Element enthält, ist je nach ABI genauso > effizient zu übergeben wie das Element selbst. Das ist bei Integern > typischerweise eine Übergabe per Register. Auch mehrere Elemente können > auf mehrere Register aufgeteilt übergeben werden. IIRC kann z.B. beim > AAPCS ein struct mit 4x "int" direkt in den Registern r0-r3 übergeben > werden, wenn es der einzige Parameter ist. Das erspart die Indirektion > beim Aufrufer und beim aufgerufenen. Und deswegen rätst du einem Programmierneuling, Strukte generell als Wert-Parameter zu übergeben? Ich denke, wer sich um Performance Gedanken machen muss, kennt die Spezialfälle und kann die entsprechend anwenden. merciless
Dirk K. schrieb: > Und deswegen rätst du einem Programmierneuling, > Strukte generell als Wert-Parameter zu übergeben? Nein, das habe ich überhaupt nicht getan. Du hast dazu geraten, immer Pointer zu verwenden, vermutlich unter der Annahme, dass es effizienter sei: Dirk K. schrieb: > Ich denke, wer sich um Performance Gedanken machen > muss Dirk K. schrieb: > Bitte nur Zeiger oder Referenzen als > Funktionsparameter verwenden ;)
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.