Gleicher Inhalt - anderes Ergebnis?



  • Hallo liebe C++ - Gemeinde,

    ich bin seit gefühlten Ewigkeiten Anfänger in Sachen C++ - ein Grund dafür ist wohl, dass ich ich immer wieder an Kleinigkeiten aufhänge, die ich nicht verstehe. Nun nehme ich wieder mal Anlauf - und lande soeben beim absehbaren Ergebnis. Ich kapiers einfach nicht und bin auch in der Literatur nicht auf klare Antworten gestoßen.
    Beim Schreiben meines ersten kleinen Programms sind folgende Fragen entstanden:

    1. Ich habe mit dem Dos-Editor eine Datei "hello_ich.cpp" erstellt,
    die einen kleinen Text auf dem Bildschirm ausgibt. Das Ganze sieht so aus:

    //listings/002/hello_ich.cpp
    #include <iostream>
    using namespace std;

    int main(void) {
    cout << "Bin ich ein Nörd?" << endl;
    return 0;
    }

    2. Die Datei war 147 Byte groß
    3. Ich habe die Datei mit Dev-cpp geöffnet und kompiliert,
    es entstand die Datei "hello_ich.exe", Gröáe: 474.990 Byte.
    (Das sind doch 475kb, oder?)
    4. Ich habe mit Dev-cpp eine Datei namens "hello_ich_vgl" also "Console
    Application" erzeugt.
    Sie erhielt die Endung *.dev - vermutlich macht das das Programm
    so und die Endung spielt keine Rolle? Die Datei enthielt die gleichen
    Zeichen,
    wie die Datei "hello_ich.cpp"
    5. Die Datei war 842 Byte groß - komisch, wie kommt das?
    6. Anschließend habe ich die Datei kompiliert.
    7. Es entstand eine Datei "hello_ich_vgl.exe" die genauso groß ist,
    wie die Datei "hello_ich.exe"
    8. Es entstanden außerdem die Dateien "main.cpp", "main.o"
    und Makefile.win
    9. Die Datei "main.cpp" enthält genau die Zeichen, die auch die
    Datei "hello_ich_vgl.dev" enthielt, war aber so groß, wie hello_ich, also
    147b. Warum erzeugt das Programm erst eine so große Datei, um anschließend
    die platzsparende Variante zu erzeugen?
    10.Wozu sind die Dateien aus 8. genau da - welchen Zweck erfüllen sie
    eigentlich?
    11.Dazu drängt sich mir noch eine Frage auf: Die EXE-Dateien sind doch fast
    500kb groß.
    Eine Diskette der guten alten Zeit hatte einen Speicher von 1,44MB. Das
    heißt, von den Dateien kann man nicht einmal 3 auf einer Diskette
    unterbringen. Habe ich mich peinlich verrechnet oder ist es ganz
    schön viel Platz für eine solch simple Anwendung? Ich kann mich
    erinnern, dass auf den Disketten doch Platz für ziemlich umfangreiche
    Programme(in meinem Fall meistens Spiele 🙂 war

    Also, mich interessierts einfach - falls mir jemand auf die Sprünge helfen kann oder die Fragen auch hat...bitte antworten.



  • 1. Code solltest du innerhalb von Code-Tags [ cpp ] code [ /cpp ] posten, das sieht dann so aus:

    #include <iostream>
    
    int main()
    {
      std::cout << "Hello, World!";
    }
    

    2. Dev-Cpp ist recht veraltet, es gibt wohl eine neue Version, aber auch die würde ich nicht unbedingt nutzen. Spricht etwas gegen VS 2012 Express oder MinGW + IDE?

    3. Diese Dateien die Dev-Cpp da erzeugt sind höchstwahrscheinlich irgendwelche Projektdateien mit ein paar Zusatzinformationen.

    4. Die Kompilierung von C/C++ Code geschiet in mehreren Schritten. Ein Schritt ist alle .cpp Dateien in Objektdateien zu kompilieren (da haste deine .o Datei). Hinterher werden diese Dateien dann vom Linker zusammen in eine ausführbare Datei gelinkt. (Hier deine .exe)

    5. Makefiles sind ein ziemlich großes Thema, kurz gesagt sind es Anweisungen für ein Programm wie gewisse Dateien zu kompilieren sind, mit C++ hat das erstmal nichts zu tun.

    6. Die Größe der .exe wird hier wohl maßgeblich vom Dateiformat (PE) Overhead bestimmt. Die Größe deines Codes in der Datei ist vielfach kleiner. Das bedeutet insbesondere dass die Größe der .exe Dateien nicht so schnell ansteigt wie du denkst. Aber auch, dass die Mindestgröße wesentlich kleiner gehalten werden kann wenn du ein anderes Format für .exe Dateien nimmst. Keine Ahnung was DOS da genutzt hat.



  • cooky451 schrieb:

    6. Die Größe der .exe wird hier wohl maßgeblich vom Dateiformat (PE) Overhead bestimmt. Die Größe deines Codes in der Datei ist vielfach kleiner. Das bedeutet insbesondere dass die Größe der .exe Dateien nicht so schnell ansteigt wie du denkst. Aber auch, dass die Mindestgröße wesentlich kleiner gehalten werden kann wenn du ein anderes Format für .exe Dateien nimmst. Keine Ahnung was DOS da genutzt hat.

    Das liegt am GCC-Compiler. Sobald man da <iostream> einbindet, hat die Datei immer gleich 470 KB. Unter Linux oder bei anderen Compilern fällt die ausführbare Datei (wesentlich) kleiner aus.



  • Vielen Dank Cooky451 und wxSkip, für eure Antwort,

    aus irgendeinem Grund konnte ich bei der Fragestellung noch nicht meinen Namen verwenden, daher zuerst Waldschrat.

    Mittlerweile bin ich auch in der Literatur etwas weiter gekommen und merke immer wieder, dass ich deutlich weniger verstehe, als da steht 😕 - aber doch immer 'n bisschen.
    Das geht mir - euch wirds nicht wundern - auch bei euren Beiträgen so und ist ja schließlich mein alter Fallstrick.
    Eines allerdings habt ihr geschafft: ich hab jetzt das Gefühl, dass der Schlüssel zum Verstehen im weitermachen liegt - das Meiste wird sich vermutlich im Laufe der Zeit aufklären. Außerdem ist das natürlich eine tolle Comunity, wenn die Mitglieder so schnell antworten - danke noch mal und

    bis immer wieder mal



  • Chicull schrieb:

    merke immer wieder, dass ich deutlich weniger verstehe, als da steht 😕

    Da gibts ne Lösung:

    1. Nochmal in Ruhe lesen und Gedanken drüber machen
    2. Wenn's dann immernoch nicht klickt, hier nachfragen. Wenn du ein ordentliches Buch hast antwortet man dir hier gerne auf Verständnisfragen, anders ist das wenn du eines der halbgaren Tutorials aus dem Netz benutzt - ein gutes Buch ist eben unersetzelich 🙂

    Das geht mir [...] auch bei euren Beiträgen so und ist ja schließlich mein alter Fallstrick.

    Fragen. Einfach fragen, wenn du was nicht verstehst. Die Leute hier kennen deinen Wissensstand nicht, können daher ihre Antworten nicht 100%ig darauf abstimmen. Wenn du etwas nicht verstehst, sag uns, was du nicht verstanden hast, dann klären wir das. 🙂

    ich hab jetzt das Gefühl, dass der Schlüssel zum Verstehen im weitermachen liegt - das Meiste wird sich vermutlich im Laufe der Zeit aufklären.

    Auch 😉



  • cooky451 schrieb:

    2. Dev-Cpp ist recht veraltet, es gibt wohl eine neue Version, aber auch die würde ich nicht unbedingt nutzen. Spricht etwas gegen VS 2012 Express oder MinGW + IDE?

    Mit DevCPP hat das alles nix zu tun, DevCPP verwendet auch bloss GCC (MinGW).

    cooky451 schrieb:

    6. Die Größe der .exe wird hier wohl maßgeblich vom Dateiformat (PE) Overhead bestimmt. Die Größe deines Codes in der Datei ist vielfach kleiner. Das bedeutet insbesondere dass die Größe der .exe Dateien nicht so schnell ansteigt wie du denkst. Aber auch, dass die Mindestgröße wesentlich kleiner gehalten werden kann wenn du ein anderes Format für .exe Dateien nimmst. Keine Ahnung was DOS da genutzt hat.

    Quatsch mit Sosse.
    Klar hat PE Overhead, aber lange keine 500K.
    Die 500K ergeben sich weil die ganze CRT und die nötigen Teile der Std.Lib. statisch mit reingelinkt werden.
    Schreibt man das selbe Programm mit puts() sieht das Ergebnis vermutlich gleich ganz anders aus.


Anmelden zum Antworten