Der Grund, warum C einfach schlecht ist


  • Administrator

    Don06 schrieb:

    _D schrieb:

    lol, wer c und c++ in den gleichen topf wirft sollte abstand halten von solchen aussagen :p

    Genau das hab ich mir auch gedacht 😉
    Übrigens so sähe das in C++ aus:

    template <typename Type, std::size_t Size>
    std::size_t array_size(Type const (& array)[Size])
    {
        return Size;
    }
    

    Genau sowas hatte ich mir auch gedacht. Bzw. vor allem habe ich mir dann gedacht, dass man in C++ halt erst gar keine C-Arrays einsetzen würde, sondern std::vector und Konsorten nehmen würde. Und die Funktion std::vector::size ist ja wirklich nicht so schwer zu verstehen. 😃

    Edit:
    @rüdiger,
    Das /sizeof(Type) ist aber unnötig 😉

    Grüssli



  • Dravere schrieb:

    Edit:
    @rüdiger,
    Das /sizeof(Type) ist aber unnötig 😉

    ups 🙂



  • Hallo,

    Danke schön für die Korrekturen, jetzt geht's, war noch ein Fehler in meinem Makefile. So ist es richtig:

    all:
    	g++ -c main2.cpp -o main2.o -Wall -Wextra -pedantic -O2
    	gcc main2.o -o main2.exe -Wall -Wextra -pedantic -O2
    

    Und wenn man noch "inline" verwendet, pusht der Compiler nur die Konstanten auf den Stack, also, kein Verlust an Geschwindigkeit durch Funktionsaufruf oder so was. Scheint genauso gut wie ein Makro zu sein...



  • Das hat mit inline nichts zu tun. inline ist außerdem eher eine Anweisung für den Linker, als für den Optimierer (der inlined eh, was er kann und für sinnvoll hält) und template-Funktionen sind eh implizit inline.



  • ~fricky schrieb:

    javafan schrieb:

    http://blog.fefe.de/?ts=b6015e3e
    Solche Hacks gibt es einfach nur in C. Mit einer sauberen Programmiersprache wäre das nicht passiert.

    das liegt nicht an der sprache, eher an schäbigen compilern. meine c-compiler fressen solche hacks nicht.
    🙂

    warum sollte man den linux kernel mit was anderem als gcc kompülieren wollen? 🙄



  • gcc fan schrieb:

    warum sollte man den linux kernel mit was anderem als gcc kompülieren wollen?

    weil ein anderer compiler möglicherweise kompakteren und schnelleren code erzeugt. mit grauen denke ich an meine experimente mit dem gcc für hcs12-controller. der output des gcc war fast doppelt so gross, als das, was der freescale-compiler ausspuckte.
    🙂



  • rüdiger schrieb:

    Das hat mit inline nichts zu tun. inline ist außerdem eher eine Anweisung für den Linker, als für den Optimierer (der inlined eh, was er kann und für sinnvoll hält) und template-Funktionen sind eh implizit inline.

    Nein, das kann nicht sein, ich habe es in der Objektdatei mit objdump nachgeschaut, einmal mit inline und einmal ohne. Die Objektdatei wird in der ersten Zeile meines Makefiles erzeugt, wo der g++ mit Option -c aufgerufen wird. Diese Option steht für nur kompilieren, nicht verlinken. Mit "inline" wird überhaupt keine Funktion generiert, nur eine einzelne Anweisung, einfach ein "push Konstante" und die Konstante ist die Größe des Arrays.



  • foo.cpp

    #include <iostream>
    
    template <typename Type, std::size_t Size>
    std::size_t array_size(Type const (&)[Size])
    {
      return Size;
    }
    
    int main()
    {
      int buf[20u] = { 0 };
      std::cout << "länge: " << array_size(buf) << '\n';
    
      return 0;
    }
    

    foo2.cpp

    #include <iostream>
    
    template <typename Type, std::size_t Size>
    inline std::size_t array_size(Type const (&)[Size])
    {
      return Size;
    }
    
    int main()
    {
      int buf[20u] = { 0 };
      std::cout << "länge: " << array_size(buf) << '\n';
    
      return 0;
    }
    
    $ g++ -Wall -W -pedantic -std=c++98 -O3 -S foo.cpp -o foo.s
    $ g++ -Wall -W -pedantic -std=c++98 -O3 -S foo2.cpp -o foo2.s
    $ diff foo.s foo2.s
    1c1
    < 	.file	"foo.cpp"
    ---
    > 	.file	"foo2.cpp"
    $ g++ --version
    g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

    Wie ich schon sagte, sind template-Funktionen eh inline. Aber beim inline geht es eben darum, dass der Linker nicht durch die Mehrfachdefinierung verwirrt wird. Der Optimierer optimiert Funktionen eh weg, wie er will (außer man verbietet ihm das).



  • ich finds immer wieder erstaunlich, dass ich c/c++ für soviele jahre als absolut überlegen empfunden habe und heute nur noch das kalte grausen bekomme, wenn ich solche seltsamen hacks in multiparadigmen sprachen sehe. interpreter ftw!



  • ^^du solltest den thread noch einmal lesen. ausserdem ist C kein multipara-dingsda. was soll das überhaupt sein?
    🙂


Anmelden zum Antworten