Style-Frage C99 Mixe Declaration & Code
-
Guten Morgen Community,
ich hab mal ne Grundsatzfrage:Seit C99 ist es ja möglich variablen deklaration mitten im code vorzunehmen sowie im Initialisierungsteil von for schleifen.
Wie handhabt der Compiler das denn genau?
Bisher bin ich davon ausgegangen das die variable dann auch erst zur Laufzeit an der angegebenen Stelle im Code deklariert und initialisiert wird.
Ist da meine bisherige Annahme korrekt?
Weil ich von einem Prof gehört habe das es nicht gut wäre Deklaration und Code zu mixen.
Zitat: "Ich halte das für unklug, ich möchte auf einen Blick am Anfang einer Funktion sehen, welche Daten sie verwendet!"
Das trifft meine Meinung da allerdings überhaupt nicht, und ich wollte einfach mal hören ob ich da mit meiner Meinung alleine stehe und mich eventuell eines besseren belehren lassen kann.
Meiner Ansicht nach ist es einfach sauberer wenn ich z.b. in einer Fall Unterscheidungen unterschiedlichen Code habe. Hier kann ich doch nur im auftretenden Fall die benötigte Variable verwenden. Diese ist ja nur eine Hilfsvariable zum ausführen des momentanigen Falls und nicht der restlichen Funktion.
Daher finde ich es einfach besser eine lokale Variable einzurichten die nach dem Semikolon einfach stirbt und nicht unnötigen Speicher verbraucht für einen Fall der eintreten könnte oder auch nicht.
Ok mann könnte jetzt sehr pedantisch sein und immer jede Funktionalität eines Falls in eigene Unterfunktionen gliedern. Daran würde mich aber die unnötigen Funktionsaufrufe stören welche einfach Performance schlucken.
Allein wenn ich nur daran denke für jede Schleife eine extra Zählvariable am Anfang einer Funktion zu definieren kommt mir ein Schauder über den Rücken.
Es würde mich freuen wenn ich ein paar andere Meinungen zu dem Thema hören könnte.
So denn Gute Nacht
Vertax
-
Deine Annahme, der generierte Code würde den Speicher genau so reservieren, wie die Variablen definiert werden, ist nicht korrekt. Der Compiler kann im Prinzip machen was er will, solange der Code sich standardkonform verhält. Viele kleine lokale Variablen existieren z.B. gar nicht im RAM, sondern nur in Registern. Zudem werden viele Funktionen geinlined, Variablen zusammengeschmissen etc., da kannst du öfter mal gar nicht mehr genau erkennen was genau denn da jetzt deine Variable war.
Speicher auf dem Stack reservieren ist im Übrigen sehr günstig, aber eben auch nicht umsonst. Insofern wird der Compiler, wenn er denn Speicher auf den Stack reserviert, mehr oder weniger viel auf einmal holen. Aber der weiß schon was er tut, insofern würde ich so etwas nicht mal in meine Design Überlegungen einfließen lassen. (Vielleicht bei totalen Mikrooptimierungen, bei denen man genau ausnutzen will was der Compiler wann wie rafft, aber selbst dann kommt der mit lokaleren Objekten wohl tendenziell besser zurecht.) (Bei C++ und Typen mit Konstruktoren und Destruktoren wird das im Übrigen etwas relevanter.)Vertaxx schrieb:
Zitat: "Ich halte das für unklug, ich möchte auf einen Blick am Anfang einer Funktion sehen, welche Daten sie verwendet!"
Nun, "So lokal wie möglich, so global wie nötig" sagt dir eher das Gegenteil. :xmas1: