Seltsames Verhalten des cc65.

Es gibt 17 Antworten in diesem Thema, welches 2.875 mal aufgerufen wurde. Der letzte Beitrag (12. Januar 2012 um 15:16) ist von Soulstealer.

  • Hallo, wenn ich bei mir Funktionen verfasse, die ich nicht anspreche, erhöhen die meinen Code. Jetzt habe ich eine *.h der gegebenen Headerdateien weggemacht.

    Jetzt bilde ich mir ein, das alleine hätte mir ein halben kb gebracht?

    Kann das sein?

  • Hallo, wenn ich bei mir Funktionen verfasse, die ich nicht anspreche, erhöhen die meinen Code.


    Seltsames Verhalten des Vernunftmensch...

    Wenn ich mein Auto mit Sandsäcken vollade die ich aber nicht brauche, dann verbraucht es mehr Sprit.

  • Nein, ganz im Ernst!

    Nur durch Einbinden der Datei Dieb.h braucht das Code-Segment 1k mehr Platz. Ich habe nicht einmal darauf verwiesen.

    Verhält es sich mit den System Headers genauso?

  • Meine erste Idee wäre, dass es beim Linken entfernt werden sollte. Vorher halt nicht, weil es könnte ja noch ein Objekt-File dazukommen, welches die Funktion anspricht.

    Zumindest hab ich das so mal gelernt, wenn ich mich recht entsinne...

  • Ok, also in der *.o Datei darf er noch nichts unnützes streichen, sehe ich ein.

    Aber spätestens der Linker muß sowas doch feststellen?

    Habe ich vielleicht eine wichtige Option nicht gesetzt?

  • Nur durch Einbinden der Datei Dieb.h braucht das Code-Segment 1k mehr Platz. Ich habe nicht einmal darauf verwiesen.


    Dann steht da möglicherweise etwas drin was dafür sorgt, dass Platz verbraucht wird.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Auch nicht.

    Drei globale Variablen und ein paar lokale, die wohl rausgenommen werden mit Option localvariables. Aber die Erklären keine 1k. Da ja nicht zugegriffen wird auf die Funktionen und Prozeduren erwarte ich dann ein mehr von paar Byte.

    Bin ich wie sooft schon aufm Holzweg?

  • vor allem kann dir solange du nicht genau sagst was du getan hast niemand sagen was eventuell das problem sein könnte.

  • Vernunftmensch: Bei den System-Headern sollte das in der Regel nicht passieren weil dort eigentlich für C nur Deklarationen und keine Definitionen drin stehen.

    Du wirst in deinem Header also sehr wahrscheinlich irgend etwas definiert haben was Speicherplatz benötigt.

  • Drei globale Variablen und ein paar lokale, die wohl rausgenommen werden mit Option localvariables. Aber die Erklären keine 1k. Da ja nicht zugegriffen wird auf die Funktionen und Prozeduren erwarte ich dann ein mehr von paar Byte.

    warum inspizierst du nicht mal den gelinkten code mit einem monitor programm?

  • Danke für die Antwort.

    Ich weiß nicht womit das zusammenhängt, aber unbenutzer Code wird voll übersetzt und kommt mit in alles weitere.

    Ob das auch in Code passiert, den ich selber nicht gemacht habe, kann ich nicht beantworten.

    ANDERE FRAGE:
    Wie kann man mit wenig Aufwand c-Code verschnellern ohne ASM?

  • Zitat

    Ich weiß nicht womit das zusammenhängt, aber unbenutzer Code wird voll übersetzt und kommt mit in alles weitere.


    wenn von einer übersetzungseinheit *irgendetwas* referenziert wird, dann wird alles darin enthaltene auch gelinkt. sprich: du musst den unbenutzten code in eine andere übersetzungseinheit packen. das ist der grund aus dem alle funktionen der library in jeweils seperaten sourcefiles sind.

  • Wie kann man mit wenig Aufwand c-Code verschnellern ohne ASM?


    Ohne jetzt dein Problem genau zu kennen, kann folgendes helfen:

    Schleifen ausrollen
    Pointer statt Wertübergabe
    Memcopy von Bereichen statt Zuweisungen

  • Quellcode von bzero und memcpy wäre nicht schlecht.

    Pointer statt Wert ist super Idee. Ich übergebe überall Werte, obwohl ich die nicht ändere.

    Zu Pointern: zustand [...][...] benutzt Multiplikation (ganz schlimm)

    Was meinst Du mit Schleifen ausrollen?

  • Er meint wohl sowas:

    for( int i = 0; i < 4; i++) {
    wert[i] = 2 * i +1;
    }

    wird zu:

    wert[0] = 2 * 0 + 1;
    wert[1] = 2 * 1 +1;
    wert[2] = 2 * 2 + 1:
    wert[3] = 2 * 3 +1;

    Damit spart man die Schleifenabfrage. Aber cc65 macht das unter bestimmten Bedingungen wohl eh automatisch.

  • Je nachdem. Manchmal verhält er sich seltsam.

    Wo findet man memcpy als asm-routine und bzero? (möchte testen, on string.h auch komplett übernommen wird, statt nur das, das gebraucht wird?)

  • Zitat

    Pointer statt Wertübergabe


    vorsicht. beim cc65 ist das *nicht* unbedingt schneller. ich würde sogar vermuten das es in ziemlich vielen fällen langsamer ist :)

    Zitat

    möchte testen, on string.h auch komplett übernommen wird, statt nur das, das gebraucht wird?


    lese nochmal post Bitte melde dich an, um diesen Link zu sehen. - da gibts nichts zu testen, die antwort ist nein. da ein header garkeinen code enthält wird daraus eh überhaupt nichts übernommen =P

  • Hi Sauhund, ich weiß das, deshalb hier nochmal der Hinweis:

    Ohne jetzt dein Problem genau zu kennen

    letzten Endes muss man sich die generierten Assembler Dateien anschauen, die mit cc65 erzeugt werden ...