Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen. Hi Leute, Referenzen sind möglichst immer Zeiger vorzuziehen (hope so?!) - es sei denn es geht nicht anders, dies ist in manchen Fällen so: - Du die Adresse auch vom Zeiger benötigst [Die Adresse einer Referenz kannst du nicht herausfinden] MfG SideWinder Scripta schrieb:
referenzen sind verkappte zeiger. sie schreiben sich den stern ('*') einfach immer von selber hin, wenn man ne referenz benutzt. naja, eigentlich steht im standard nix davon, daß referenzen zeiger sind. aber nur, um den compilerbauern noch mehr freiheiten zu lassen, zum beispiel gleiche einträge in der symboltabelle statt zeiger oder ähnliches, aber mir scheint, die ganzen details fliegen auch von alleine weg, wenn man sich nen optimierenden compiler vorstellt. referenzen können nicht auf 0 zeigen. also
und
normale compiler schlücken das zwar, aber verboten isses trotzdem. hier greift ein grund für referenzen: der compiler weiß mehr details. daher kann er besser optimieren. ist aber eigentlich um, weil compiler schon recht viel von alleine rausfinden und weil jeder wie er lust hat, __assume__(p!=0) und ähnliches in seinen code einischreiben darf. der grund ist eher irrelevant und mikrooptimierung. bei der gcc kann man afair dem funktionsparameter ne zusatzdeklaration geben, die sagt, daß er ein nicht-null-zeiger ist. betrifft das testen, ob ein nullzugriff passieren wird (der compiler testet eh nur max. einmal pro funktion, beim ersten zugriff, mit zuatz-deklaration halt gar nicht). der andere grund ist: refs dürfen nicht auf 0 zeigen, daher verwenden viele deppen sie, um das im prototyp anzugeben. also
und
nachteile liegen auf der hand:
schreiben. also tests ohne jede inhaltliche berechtigung. -das debuggen wird um größenordnungen schwieriger. und da mal die zehnfachen kosten im vergleich zum reinen codieren beim debuggen liegen, ist doch das ein wichtiger punkt. stell dir vor, mit dem debugger oder testausgaben fand ich heraus, daß an der markiertren stelle x einen falschen wert hat.
und stelle dir weiter vor, du hättest keinen programmierstil.
und jetzt mit ein wenig stil. einfach nur: meide refs, außer es sind const refs.
volkard schrieb:
Das halte ich für eine falsche Sichtweise. Ich sehe das eher so wie Stephen Dewhurst: References Are Aliases, Not Pointers @Wutz
Schau dir die Exe von meinem Beispiel mit einem Hex-Editor an und du wirst "Hallo Welt" finden. Unter einem Programm-Modul verstehe ich eine ausführbare Datei. Diese kann die Dateiendung exe, dll, oder was auch immer haben. Und natürlich achte ich auf const correctness. Aber du wirst lachen. Ich kenne sehr viele C Programmierer für denen const ein nutzloses Schlüsselwort ist.
Verzeih mir bitte dass ich mich mit den Begrifflichkeiten nicht so auskenne. Aber ich behandele Konstanten und String Literale so, als wären sie static const dekaliert worden. Und ich glaube ich weis auch was du meinst. Bei einem kleinen Embedded-Prozessor wurden const Variablen im Flash gespeichert und beim Programm-Start ins Ram geladen. Wurden Variablen dagegen als static const deklariert, so wurde der Zugriff direkt auf den Flash Speicher umgebogen. Und der war schreibgeschützt. Bei einem anderen Betriebssystem könnte dies anderes implementiert sein.
Ich habe auch überhaupt nicht s2 gemeint, sondern folgendes:
L ist ein Zeiger auf ein Array.
Habe ich schon erwähnt dass ich einige C Programmierer kennen, welche nicht const kennen? Ja auch solche welche void CalcSum(void) Programme schreiben? Ich will hier auch keinen Flamewar starten, sondern ich stöbere gerade das Buch Effective Modern C++ durch, und da tauchen so viele Detailfragen im Bezug auf Templates Type Deduction auf. Und die eine ist halt der Unterschied zwischen Array und Zeiger.
So jetzt bitte nicht ärgern. Hier kommt eine Detailfrage. Bedeutet dass das man unter C Variablen mittels = initialisiert? Dann dürfte der Code unter C++ nicht funktionen, da ich das Array hier nicht initialisiere, sondern einem String Literal mittels dem = Operator zuweise. |