The "C is Efficient" Language Fallacy



  • Man kann ja einfach schauen ob sich [trg, trg+N] mit [src, src+N] schneidet, da die Daten ja sequentiell im Speicher liegen.

    Siehe http://www.ddj.com/cpp/184401611



  • rüdiger schrieb:

    Man kann ja einfach schauen ob sich [trg, trg+N] mit [src, src+N] schneidet, da die Daten ja sequentiell im Speicher liegen.

    bei so primitiven sachen: ja.
    aber nicht bei komplexeren statements.



  • Tim schrieb:

    Das verstehe ich irgendwie nicht.

    Hab ich doch gleich gesagt, aber ~john hats dir ja jetzt erklärt.



  • lollol schrieb:

    Tim schrieb:

    Das verstehe ich irgendwie nicht.

    Hab ich doch gleich gesagt, aber ~john hats dir ja jetzt erklärt.

    quatsch, beide gingen von anderen voraussetzungen aus.
    🙂



  • @ShadeOfMine
    Warum sollte es bei komplexen Beispielen nicht funktionieren? Der Compiler kann ja selbst wenn er nicht inlined verschiedene Varianten einer Funktion anlegen und aufrufen. Sicher wird ein Array auch implizit zu einem Pointer. Aber das heißt nicht, dass er die Information bei einem Aufruf verlieren muss. Solange er in der statischen Analyse beweisen kann, dass der konkrete Aufruf frei ist von Überschneidungen kann er direkt eine dafür optimierte Version aufrufen.



  • für solche kopierorgien gibts unter Java 'System.arraycopy()'.

    Jaja, darum ging es nicht. In C gibt es ja auch memcpy und in C++ std::copy.

    Du kannst nicht garantieren dass die beiden arrays nicht überlappen...

    Du kannst eine spezialisierte Funktion schreiben, die vorraussetzt, dass die beiden Arrays sich nicht ueberlappen. Wenn du diese einsetzt, dann ist der Benutzer der FUnktion fuer das Einhalten der Spezifikation verantwortlich.



  • rüdiger schrieb:

    Warum sollte es bei komplexen Beispielen nicht funktionieren? Der Compiler kann ja selbst wenn er nicht inlined verschiedene Varianten einer Funktion anlegen und aufrufen. Sicher wird ein Array auch implizit zu einem Pointer. Aber das heißt nicht, dass er die Information bei einem Aufruf verlieren muss. Solange er in der statischen Analyse beweisen kann, dass der konkrete Aufruf frei ist von Überschneidungen kann er direkt eine dafür optimierte Version aufrufen.

    Ja du kannst ein konservatives verhalten implementieren - keine frage. aber du kannst nicht anhand der parameter garantieren dass keine überappung stattfindet. nicht immer. manchmal kannst du es - aber du musst es zur laufzeit entscheiden und im zweifelsfall konservativ sein.

    @knivil:
    der compiler kann einfach nicht optimieren. sowas einfaches wie

    *a+=*b;
    *c+=*b;

    ist nicht parallelisierbar vom compiler. der overhead um zu checken ob es überlappungen gibt wäre größer als der nutzen. du kannst nämlich nur zur laufzeit checken.

    deshalb hat man in c restrict. das behebt dieses problem. in c++ fehlt es bitterlcih, aber man will wohl nicht so low levelig werden...


Anmelden zum Antworten