effizientes c++ auch ohne zeiger??


  • Administrator

    @u_ser-l,
    Toll, dann ist das ganze Programm ein Zeiger, denn jedes Programm und jeder Speicher des Programmes muss auf den Hauptspeicher. Und der Hauptspeicher wird über Zeiger angesprochen. Daher ist deine Aussage nicht wirklich sinnvoll.

    In der Ebene von C++ ist eine Referenz jedenfalls kein Zeiger. Und wir reden hier schliesslich in der Ebene von C++ und nicht in der Ebene des Hauptspeichers oder der CPU.

    Grüssli



  • Bulli schrieb:

    Sonst könnte man auch Zeiger benutzen, und Referenzen hätte man nicht "erfinden" brauchen.

    hätte man auch nicht. egal ob es zeiger oder 'referenzen' gibt. durch das eine wird das andere redundant.
    🙂



  • u_ser-l schrieb:

    in Deinem Beispiel ist int ein elementarer Datentyp, das ist nun gerade eine Ausnahmesituation, die ich in meinem Posting mehrfach ausgenommen hatte - der Compiler wird die Referenz wohl wegoptimieren. Na und ?

    In den meisten Fällen hat man es mit komplexen Datentypen zu tun, und dann ist Zeiger und Referenz Jacke wie Hose.

    Nein, das trifft auch auf komplexe Objekte zu. In C++ gibt es keinen Unterschied zwischen elementaren Datentypen und komplexen Typen. Deshalb schreibt BS auch von "Objekten", da in C++ alles Objekte sind... auch int s. Schließlich kann ich das machen:

    int *i = new int;
    string *s = new string;
    int i;
    string s;
    

    Das trifft dann natürlich auch auf Referenzen zu!

    string s("Hallo");
    string &a = s;
    a += " Welt!"; // wird an s angehängt!
    

    u_ser-l schrieb:

    An meiner Aussage ändert das nichts -

    Schön, du kannst gerne deine Aussage behalten. Nur leider glaube ich eher dem C++-Erfinder, als einem Unreg-User wie Dir.

    u_ser-l schrieb:

    Auf Zeiger zu verzichten hieße ständiges Kopieren und Neu-Erzeugen von Objekten, was auf die Dauer den Speicher zumüllt und außerdem Zeit verschwendet.

    Wer sagt denn das immer was kopiert wird? Wird es ebend nicht, mit dem Konzept des Alias! (alternativer Name für ein Objekt)



  • langsam geht mir die Wortklauberei auf die Referenz.. äh, auf den Zeiger 🙂

    Also gut, ich habe mich offenbar unklar ausgedrückt:

    Außer in einfachen Fällen oder Sonderfällen (Referenzen nur zur Umbenennung von Variablen, Funktionen nur call-by-value, ...) ist es nicht möglich, in C++ auf Zeiger zu verzichten, sei es explizit (*,&-Operator) oder implizit (Referenz).

    Nun zur Frage Zeiger!=Referenz: Wenn man Referenzen so wie Du verwendet, also nur zur Umbenennung einer Variable, dann kann der Compiler dies sicherlich wegoptimieren, und einen Zeiger oder ein int oder was auch immer für beides benutzen, Ok. In Deinem Fall ist die Benutzung der Referenz überflüssig, ein i++ hätte es auch getan.

    Ein Beispiel, in denen ein Sprachfeature redundant angewendet wird, ist aber auch nicht gerade optimal zur Erläuterung gerade dieses Sprachfeatures.

    Anwendungen von Referenzen in nichttrivialen Zusammenhängen, etwa als Funtionsparameter wie in

    void foo(bar& aBar)
    

    werden wiederum als Zeiger realisiert. Und da ist dann nichts mehr wegzuoptimieren, wenn aBar in der Funktion foo verändert werden muß: Es wird ein Zeiger übergeben, auch wenn dieser auf syntaktischer Ebene "Referenz" heißt.

    Abgesehen davon wird es kein Zufall sein, daß Referenzen als "implizite Zeiger" bezeichnet werden.

    Mein Fazit:

    Der Fragesteller fragte, ob es möglich ist, in C++ *komplett* auf Zeiger zu verzichten, nicht nur auf *syntaktischer* Ebene. Dieses ist in den meisten Anwendungsfällen zu verneinen. Man bekäme nicht einmal ein File mit einem Namen als char* geöffnet, man könnte keine Funktionen definieren, die ihre Argumente manipulieren, usw.

    Beispiele für Sprachen, die ohne Zeiger auskommen, wären wohl einige sehr frühe BASIC-Dialekte, in denen keine Funktionen definiert werden können, keine Arrays existieren und die nur mit LET, REM, GOTO, GOSUB, PRINT, END und ein paar weiteren Befehlen auskommen. Denkbar wären auch Makro- oder Termersetzungssprachen.



  • 🙄



  • ~fricky schrieb:

    Bulli schrieb:

    Sonst könnte man auch Zeiger benutzen, und Referenzen hätte man nicht "erfinden" brauchen.

    hätte man auch nicht. egal ob es zeiger oder 'referenzen' gibt. durch das eine wird das andere redundant.
    🙂

    Aber nur aus deiner Java-Sicht (wo diese sogenannten Referenzen nichts mit den C++-Referenzen zu tun haben), mein Lieber 😉

    Referenzen sind tatsächlich nur andere Namen. Das tolle an den Dingern ist, dass man damit dem Compiler explizit sagt: „Hömma Jung, da kannste einiges wegoptimieren.“

    Und @user_l, wenn jemand anderes in seinem Code für die Implementierung der von mir genannten Objekte Zeiger verwendet, soll er doch ;). Ich muss es jedenfalls nicht tun, das war der Kern meiner Aussage. Man abstrahiert sich quasi den Teil der Zeiger, den man benötigt (Referenzierung bei Referenzen (genial, wa? ;)), Laufen über den Speicher bei Iteratoren, Anlegen der Daten auf dem Heap bei Smart Pointern) heraus und benutzt nur diesen.

    u_ser-l schrieb:

    Nun zur Frage Zeiger!=Referenz: Wenn man Referenzen so wie Du verwendet, also nur zur Umbenennung einer Variable, dann kann der Compiler dies sicherlich wegoptimieren, und einen Zeiger oder ein int oder was auch immer für beides benutzen, Ok. In Deinem Fall ist die Benutzung der Referenz überflüssig, ein i++ hätte es auch getan.

    Es war ja auch nur ein einfaches Beispiel. Variablennamen wie crazy_gen_func(palim).member().var kürzt man sich schon ganz gerne ab (auch, damit man den Kram weder mehrmals ausrechnen noch kopieren muss).

    u_ser-l schrieb:

    Anwendungen von Referenzen in nichttrivialen Zusammenhängen, etwa als Funtionsparameter wie in

    void foo(bar& aBar)
    

    werden wiederum als Zeiger realisiert. Und da ist dann nichts mehr wegzuoptimieren, wenn aBar in der Funktion foo verändert werden muß: Es wird ein Zeiger übergeben, auch wenn dieser auf syntaktischer Ebene "Referenz" heißt.

    Da ist aber sowas von zu optimieren. Schonmal von Inlining gehört? Mal abgesehen davon, starte mal gdb mit einem beliebigen simplen Programm und schau, wie oft da steht parameter optimized out .

    u_ser-l schrieb:

    Abgesehen davon wird es kein Zufall sein, daß Referenzen als "implizite Zeiger" bezeichnet werden.

    Werden sie? Hab ich noch nie gehört.

    u_ser-l schrieb:

    Der Fragesteller fragte, ob es möglich ist, in C++ *komplett* auf Zeiger zu verzichten, nicht nur auf *syntaktischer* Ebene. Dieses ist in den meisten Anwendungsfällen zu verneinen. Man bekäme nicht einmal ein File mit einem Namen als char* geöffnet, man könnte keine Funktionen definieren, die ihre Argumente manipulieren, usw.

    Referenzen sind keine Zeiger, Arrays auch nicht.

    Abgesehen von dem ganzen Kram fehlt das einzige, wo man wirklich einen Zeiger verwenden muss, weil es im Sprachstandard verankert ist. Denk mal an Klassen, in deren Methoden das eigene Objekt einer Funktion übergeben werden soll 😉



  • @bulli:

    gOo0gle Suche nach:

    c++-faq-lite references
    

    und dann nachlesen unter "Underneath it all ..."

    Referenzen sind eben kein anderes Konzept als Zeiger, sie heißen nur anders und haben eine andere Syntax.



  • Bei...

    int a = 3;
    int &b = a;
    

    ...wird doch keine Zeigervariable angelegt. Der Compiler sieht b als a.
    Also nix Zeiger.

    😕



  • u_ser-l schrieb:

    Referenzen sind eben kein anderes Konzept als Zeiger, sie heißen nur anders und haben eine andere Syntax.

    Genau, das macht Sinn! 👍 🙄



  • The nitpicking feast is open. 🙂



  • nach Eurer Argumentation müßte dann 0x10+0x1 etwas Anderes sein als 16+1.

    Der Compiler macht aber aus beidem dasselbe add.

    "andere Syntax => anderes Konzept" gilt eben nicht immer, besonders nicht in einer Syntaxregel-reichhaltigen Sprache wie C++, wo mehrfach dasselbe Konzept in verschiedene Syntax eingekleidet ist. printf und cout << ist ja auch nicht wirklich etwas Anderes, obwohl die Syntax verschieden ist.


  • Administrator

    C++ Ebene != CPU Ebene

    Ich kann mich nur wiederholen. Wenn du es von der Hardware aus anschaust, vom kompilierten Code her, dann kann man nicht auf Zeiger verzichten, das ist korrekt. Aber dem Threadersteller ging es um die Zeiger in C++, also der Programmiersprache C++ und nicht das was nach dem Kompilieren herauskommt. Und wenn wir auf der Ebene von C++ bleiben, dann kann man auf Zeiger verzichten und dann sind Referenzen keine Zeiger. Punkt und aus.

    Grüssli



  • u_ser-l schrieb:

    nach Eurer Argumentation müßte dann 0x10+0x1 etwas Anderes sein als 16+1.

    Man kann auch Worte nach belieben im Munde herumdrehen. Fakt ist, das Referenzen keine Zeiger sein müssen, und in der Praxis auch je nach Compiler/Optimierung nicht sind.

    Wenn ich schreibe:
    int a = 1;
    int * b = &a;

    erwarte ich das zwei Speicherbereiche belegt werden (Einmal der Wert, einmal die Adresse).

    Im Falle von:
    int a = 1;
    int & b = a;

    Ist es aber voraussichtlich nur ein Speicherbereich (Der Wert), der im Programmcode über zwei Namen angesprochen werden kann.

    cu André



  • Dravere schrieb:

    Aber dem Threadersteller ging es um die Zeiger in C++, also der Programmiersprache C++ und nicht das was nach dem Kompilieren herauskommt.

    Der TE sagte aber "... komplett auf Zeiger verzichten" und nicht: "... auf * und & verzichten".

    Dravere schrieb:

    Und wenn wir auf der Ebene von C++ bleiben, dann kann man auf Zeiger verzichten

    und wie öffnest Du in C++ ein File ohne char* ?

    Grüße



  • asc schrieb:

    Im Falle von:
    int a = 1;
    int & b = a;

    Ist es aber voraussichtlich nur ein Speicherbereich (Der Wert), der im Programmcode über zwei Namen angesprochen werden kann.

    ja, das ist eine syntaktische Sache, die auf der Maschinenebene wahrscheinlich nicht abgebildet wird. Das hatten wir doch schon.

    Erinnert etwas an Hütchenspielerei - ein Syntaxkonstrukt veranschaulichen mit einem Beispiel, bei dem der Compiler just dieses Konstrukt ins Nichts wegoptimiert.

    Bei

    void foo(bar& aBar)
    

    kann der Compiler aber nicht wegoptimieren und übergibt einen Zeiger.

    Wir streiten uns hier über ein syntaktisches Konstrukt "&", das in C++ mehrere verschiedene Bedeutungen hat - u.a. Umbenennung von Variablen, Referenzparameter, ...

    Ehrlich gesagt, hätte ich jetzt lieber einen freien Rest-Sonntag, ciao.



  • Ja, der TE sollte mal genauer formulieren...

    u_ser-l schrieb:

    und wie öffnest Du in C++ ein File ohne char* ?

    Nicht die C++ -STDLib nutzen.


  • Administrator

    u_ser-l schrieb:

    Der TE sagte aber "... komplett auf Zeiger verzichten" und nicht: "... auf * und & verzichten".

    Du solltest mal die Beschreibung dieses Forums lesen. Wir sind hier im C++ Forum, also der Programmiersprache C++. Wenn hier jemand "komplett auf Zeiger verzichten" schreibt, dann nehme ich logischerweise an, dass er damit meint, dass er auf die Zeiger in der Programmiersprache C++ verzichten will. Sonst ist er schlicht und einfach gesagt im falschen Forum!
    Es macht auch keinen Sinn, wieso jemand auf Zeiger verzichten möchte, welche ihn gar nicht stören, da er sie gar nie sieht ... :p

    u_ser-l schrieb:

    und wie öffnest Du in C++ ein File ohne char* ?

    std::string path;
    std::fstream file(path.c_str());
    

    Ich habe selber nie ein char const* verwendet! Konnte persönlich also vollständig darauf verzichten.
    Und im neuen Standard kann man ja dann auch sogar das folgende machen, falls du wirklich so ein Erbsenzähler bist:

    std::string path;
    std::fstream file(path);
    

    Grüssli



  • Dravere schrieb:

    Es macht auch keinen Sinn, wieso jemand auf Zeiger verzichten möchte, welche ihn gar nicht stören, da er sie gar nie sieht ... :p

    langsam verstehen wir uns 👍

    Das ist wie mit den bugs - man sieht sie nicht, und doch sind sie da.

    Jetzt aber schönen Sonntang noch.



  • @u_ser-l!
    Dann ist wohl a und b hier auch für dich das gleiche?

    int a = 100;
    int b = 0100;
    

    Nach deiner Argumentation sind beide gleich, da der Compiler daraus Dezimalwerte macht. Wo würden wr denn in Zukunft hinkommen, wenn eh alles angeblich gleich sein soll, nur weil am Ende im Speicher alles als Bits abgebildet wird. Weißt, mich als C++-Programmierer interessiert das was der COmpiler macht, nur zweitrangig. Wenn man mit anderen Menschen kommuniziert, muß man sich an Regeln halten. Und wir reden hier C++...



  • In C++ haben nun mal oft mehrere verschiedene Konzepte gleiche Syntaxelemente: '&' für Ref.Var., '&' für Ref.Parameter, '&' für 'und', '&' für ...
    ähnlich auch bei 'static', '>>' usw.

    - andererseits werden gelegentlich gleiche Konzepte durch verschiedene Syntaxelemente (z.B. Zeiger *und* Referenzen für die Argumentübergabe 'by reference') repräsentiert.

    Daß bei C++ keine eindeutige Zuordnung zwischen Konzepten und Syntaxelementen vorliegt, erschwert eine Diskussion wie diese hier.

    Aber das ist nun ein Thema, das nicht mehr in's "C++"-Forum gehört.


Anmelden zum Antworten