Gibt es für einen C++ Programmierer noch Gründe C zu lernen?



  • Kann einer der C Vertreter mal ein konkretes Beispiel dafür nennen an welche Systemressourcen man mit C rankommt, was man aber mit reinem C++ nicht schafft?



  • Nunja da C eine Untermenge von C++ ist(wenn auch mit kleinen unterschieden),
    kann man natürlich alles was man in C machen kann auch in C++, aber dabei musst du eigentlcih auch wieder auf die C funktionen zurückgreifen (ctime...).



  • mocky schrieb:

    Kann einer der C Vertreter mal ein konkretes Beispiel dafür nennen an welche Systemressourcen man mit C rankommt, was man aber mit reinem C++ nicht schafft?

    weil man mit einem c++ compiler auch wie in c programmieren kann wird's das kaum geben. wer aber gewohnt ist 'in c++ zu denken' und ausgiebig gebrauch von den c++ features macht, wird an einer reinen c-umgebung sich erstmal die zähnchen ausbeissen.



  • mocky schrieb:

    Kann einer der C Vertreter mal ein konkretes Beispiel dafür nennen an welche Systemressourcen man mit C rankommt, was man aber mit reinem C++ nicht schafft?

    sowas gibt es an sich nicht, denn mit C++ kann man im Prinzip auf die selben Bibliotheken von C (glibc) zugreifen und linken. Ich weiß nicht, wie Systemprogrammierung unter Windows aussieht, aber unter Unix ist es besser gleich C zu nehmen, weil das System an sich in C geschrieben wurde und keine C++ Strukturen beinhaltet. Deswegen ist es so, wenn du Systemprogrammierung mit C++ betreibst, dann ist letzten Endes C Programmierung und lässt den C++ Compiler C Code übersetzen, weil du nur C Strukturen zur Verfügung hast und somit praktisch nur i C den Code schreiben kannst. Klar kannst du dir eigene Klassen definieren, aber du wirst die Klassen auf C structs runterprogrammieren, weil die System Routinen keine C++ Strukturen beherrschen.

    C++ generiert in der Regel immer größere Binaries, und wenn du für ein System programmierst, welches nur begränzt Speicher hat, wie bei Microcontrollern oder ähnliche Geschichten, dann ist es von Vorteil, wenn du schlanke Binaries erzeugen kannst, und C erzeugt in der Regel schlanke (auf jeden Fall viele kleinere als C++) Binaries.



  • Ist es aber nicht so, dass durch den Einsatz von Klassen auf bereits programmierte Codeteile zurückgegriffen wird, womit der benötigte Speicherplatz verringert wird, da nich alles doppelt und dreifach geschrieben wird?



  • in gewisser weise schon aber man kann doch bei C wiederum auch funktionen definieren diem an dann wieder verwendet

    gReeTz Bigzed



  • Ja schon. Aber angenommen, du hast ne Menge verschiedener Strukturtypen, auf die eine bestimmte Operation angwendet werden soll, die bei allen ziemlich gleich ist. Aufgrund verschiedener Typen kann man das nicht mit einer Fkt. lösen, sondern muss mehrere schreiben (für jeden Typen eine). Da ist ein OO-Ansatz weniger speicherintensiv.

    mfg
    Xul



  • ich weiß wirklich nicht, wie die Compiler so etwas in der Tat umsetzen. Aber rede nur von meinen eigenen Erfahrungen mit C und C++. Z.b:

    #include <stdio.h>
    
    int main(void) { printf("Hallo\n"); return 0; }
    

    und

    #include <iostream>
    
    int main(void) { std::cout << "Hallo" << std::endl; return 0; }
    

    gleiche Funktionalität

    und hab so kompiliert:

    $ gcc hello.c -o hello-c
    $ g++ hello.cpp -o hello-cpp
    

    und ls sagt

    supertux@supertux:~/tmp> ls hello-c*
    -rwxr-xr-x 1 supertux users 6.3K May  2 22:25 hello-c
    -rwxr-xr-x 1 supertux users 8.5K May  2 22:26 hello-cpp
    

    ganze 2.3 KB Unterschied. Mag hier wenig sein, aber für große Projekte kann es zu einigen MB Unterschied kommen. Und selbst die Geschwindigkeit ist bei dem C++ minimal langsam

    supertux@supertux:~/tmp> time ./hello-c
    Hallo
    
    real    0m0.001s
    user    0m0.000s
    sys     0m0.000s
    supertux@supertux:~/tmp> time ./hello-cpp 
    Hallo
    
    real    0m0.007s
    user    0m0.000s
    sys     0m0.004s
    

    Und in manchen Anwenungsbereichen kann das sehr wichtig werden.



  • Nun gut, da haste dir grad die "fetten" iostreams rausgesucht. 🙂
    Aber schon alleine der Luxus einfach alles an cout <<en zu können wäre mir das wert.
    Außerdem kannst du deine Binaries ja auch noch strippen.



  • hehejo schrieb:

    Außerdem kannst du deine Binaries ja auch noch strippen.

    klar kannst du das, aber sicherlich auch C Binaries, oder?

    Ich mein, wenn du C++ immer benutzen willst, ist deine Sache. Keine Sprache ist universal anwendbar, im Sinne, dass sie überall eingsetzt werden kann, und C++ kannst du eben nicht immer benutzen, das sollte dir klar sein. Ich meide die C++ Programmierung, ich mag C viel mehr. Aber wenn ich Klassen oder Vektoren, Map, usw. brauche, dann benutze ich C++.



  • net schrieb:

    mocky schrieb:

    Kann einer der C Vertreter mal ein konkretes Beispiel dafür nennen an welche Systemressourcen man mit C rankommt, was man aber mit reinem C++ nicht schafft?

    weil man mit einem c++ compiler auch wie in c programmieren kann wird's das kaum geben. wer aber gewohnt ist 'in c++ zu denken' und ausgiebig gebrauch von den c++ features macht, wird an einer reinen c-umgebung sich erstmal die zähnchen ausbeissen.

    Stimmt ;-), besonder wenn man eine Software fuer den PC mit C++ geschrieben hat und dann die selbe funktionallitaet auf DSP mit reinem C Compiler umsetzten muss.

    ->Gibst Software die eine C++ klasse in reinen C code automatisiert umschreibt?



  • supertux schrieb:

    ganze 2.3 KB Unterschied. Mag hier wenig sein, aber für große Projekte kann es zu einigen MB Unterschied kommen. Und selbst die Geschwindigkeit ist bei dem C++ minimal langsam

    dann übersetz mal deinen c-code (das mit dem printf) mit 'nem c++ compiler - du wirst kaum einen unterschied mehr feststellen.

    supertux schrieb:

    Ich meide die C++ Programmierung, ich mag C viel mehr. Aber wenn ich Klassen oder Vektoren, Map, usw. brauche, dann benutze ich C++.

    hey, das sehe ich auch so 👍

    Flow_cplus schrieb:

    ->Gibst Software die eine C++ klasse in reinen C code automatisiert umschreibt?

    kannste von hand machen
    wenn du in c++ hast

    class X
    {
       int data;
       ...
       void method (void)
       {
          ...
       }
       ....
    };
    ...
    X x;
    x.method();
    ...
    

    machste z.b. so in c

    struct X
    {
       int data_1;
       ...
    };
    ...
    void method (struct X *x)
    {
       ...
    }
    ...
    struct X x;
    method (&x);
    ...
    


  • Storm.Xapek.de schrieb:

    Nunja da C eine Untermenge von C++ ist

    Nein, ist es nicht! Punkt.

    @supertux
    Dein Beispiel mit den Streams ist ja schön und gut, aber man weiss ja, dass diese recht grosse Binaries erzeugen. Das ist aber kein Problem der Sprache ansich, sondern liegt vielmehr an der imo schlechten Definition und Implementierung der Streams. Theoretisch sollten diese weniger Speicher verbrauchen und schneller arbeiten als C's ...printf Funktionen (was ganz einfach daran liegt, dass die Typinformationen bereits zur Complietime feststehen und nicht erst geparst werden müssen). Die Realität sieht aber leider anders aus.
    Und an die C Programmierer hier (zu den ich ja auch gehöre 🙂 ), was hindert euch daran, einen Systemkernel mit C++ zu programmieren, genauso wie ihr das mit C machen würdet? Ihr hättet sogar noch einige Annehmlichkeiten mehr, wie zB Templates. Und ich bezweifle auch, dass die Compiler/Linker dann grossartig andere Binaries erstellen als reine C Compiler. Ihr müsst in C++ OO ja nicht verwenden, das ist lediglich _eines_ der Paradigmen. Ihr könnt genauso gut strukturiert damit arbeiten. Und diese "C versaut dir deinen C++ Stil" oder "wenn du mit C++ programmierst, fehlt dir das Verständnis für C" Argumente, die ich immer wieder höre, sind schlichtweg absoluter Käse. Erstmal ist das individuell unterschiedlich. Für Leute, die schon länger Erfahrung in C und/oder C++ haben, ist das sicherlich weniger ein Problem als für Anfänger. Und zweitens, es soll ja Leute geben, die auch mehrere Programmiersprachen können. Warum soll es also nicht möglich sein, innerhalb einer Programmiersprache mehrere Paradigmen zu beherrschen? Da ich selbst den Schritt irgendwann von C nach C++ gemacht habe, ohne dabei C aufzugeben, kann ich da aus eigener Erfahrung sprechen. Und plapper nicht irgendwelche Pseudo-Argumente nach.



  • groovemaster schrieb:

    was hindert euch daran, einen Systemkernel mit C++ zu programmieren, genauso wie ihr das mit C machen würdet? Ihr hättet sogar noch einige Annehmlichkeiten mehr, wie zB Templates.

    mich hindert daran, dass ich den code dann überall nicht einsetzen kann, wo nur ein c aber kein c++ compiler zur verfügung steht. da bleib' ich lieber gleich bei c und freue mich über jeden error wenn ich mal 'ne variable zwischen zwei anweisungen definiert habe.



  • groovemaster schrieb:

    Storm.Xapek.de schrieb:

    Nunja da C eine Untermenge von C++ ist

    Nein, ist es nicht! Punkt.

    *punktwegradier*

    Kannst du da genauer werden? Das hab ich noch nie ernsthaft von jemandem gehört.



  • net schrieb:

    mich hindert daran, dass ich den code dann überall nicht einsetzen kann, wo nur ein c aber kein c++ compiler zur verfügung steht.

    Naja, wenn kein C++ Compiler zur Verfügung steht, dann versteht es sich ja von selbst, dass in C++ nicht entwickelt werden kann. Davon bin ich einfach mal ausgegangen.

    pZy schrieb:

    Kannst du da genauer werden? Das hab ich noch nie ernsthaft von jemandem gehört.

    C und C++ sind zwei vollkommen unabhängige Sprachen. Weder ist die eine Vorgänger der anderen, noch die andere Nachfolger der einen. Und zu 100% kompatibel sind sie sowieso nicht. C kennt zB keine Templates, C++ keine VLAs. Das einzige, was die Sprachen verbindet, ist, dass C die Basis bei der Entwicklung von C++ war. Das hätte aber genauso gut jede andere Sprache sein können. Von daher, trenne die Sprachen und wirf sie nicht in einen Topf. Und gut ist.



  • Gibt es für einen C++ Programmierer noch Gründe C zu lernen?

    - Esgibt nicht auf allen systemen C++
    - es gibt nicht auf allen Systemen nen wirklich standardnahen C++ compiler.
    - es gibt einige 100% C-Standard konforme Compiler, es gibt aber keinen 100% Ansi C++ Standard konformen Compiler.
    - Man sollte einige C-Spezifische dinge soweiso kennen, da kaum ein C++ Programmierer ganz ohne C-Schnittstellen auskommt.

    Unter C isses tendentiell leichter sehr performant zu programmieren ... in C++ ist die verleitung zu Objektorientierung und einfacheren und wartbareren Code auf kosten der performance viel zu gross. Es geht, auch mit C++ und Objecten, aber an vielen Stellen tut es weh (ok, manche finden auch templates mit ueber 10 vorlageparameter ausgesprochen schoen) und man muss viel mehr "vorsaetzlich performant" denken.

    Zu deutsch, unter C stellt sich nie die frage: performant ? Man implementiert es meistens so das es am schnellsten geht.
    Unter C++ stellt sich die Frage viel zu oft ... Mach ichs sauber, oder mach ichs schnell .... C++ ist nix fuer leute Gewissenskonflikten ^^

    Ciao ...



  • RHBaum schrieb:

    Unter C isses tendentiell leichter sehr performant zu programmieren ... in C++ ist die verleitung zu Objektorientierung und einfacheren und wartbareren Code auf kosten der performance viel zu gross.

    Nur weil jemand Klassen nutzt, heisst das noch lange nicht, dass er damit nicht performant ist. Und C verleitet zu mangelnder Performance genauso wie C++. Wie viele C Programmierer kennst du, die keine C-Strings oder nicht die ...printf Funktionen nutzen? Wahrscheinlich nicht sehr viel. Beides ist jedoch alles andere als wirklich performant. Leider sind die entsprechenden Äquivalente der STL das auch nicht. std::string scheitert zB daran, dass er per default immer dynamisch arbeitet. Und die Streams wurden ja schon hinlänglich durchgekaut.



  • Ein wichtiger, praktischer Punkt scheint mir oft vergessen zu werden: Language Bindings. Es ist ziemlich nervenaufreibend, andere Sprachen in C++-dominierte Systeme mit einzuflechten. C++ ist zB auch deswegen die meistverwendetste Sprache im KDE-Projekt: nicht weil C++ so toll ist, sondern weil die meinsten Bindings erst deutlich später kamen. In C ist das nie wirklich ein Problem gewesen.



  • net schrieb:

    dann übersetz mal deinen c-code (das mit dem printf) mit 'nem c++ compiler - du wirst kaum einen unterschied mehr feststellen.

    wenn ich das mache, dann hat mein C++ C Code kompiliert. Dann ist es klar, dass die Binaries ungefähr gleich groß sein werden.

    Würde ich die C++ Streams in C programmieren, würde die C Binary 100% größer.


Anmelden zum Antworten