Performance vs. Design



  • aber es gibt 64bit compiler, die ein 32bit int definiert haben.

    MSVC zum bleistift



  • ghorst schrieb:

    size_t sollte nicht so groß wie int sondern wie der systemübliche zeiger sein. das ist auf den meisten systemen haarspalterei, aber es gibt 64bit compiler, die ein 32bit int definiert haben.

    Ich dachte, das wäre so definiert, also Integer-Grösse:

    typedef unsigned int size_t;
    


  • @nexus so kann es definiert werden, wenn int und die größe des zeigers zusammenfallen. aber bei einem compiler, der eine unterschiedliche größen für ints und zeiger hat (wie der von hustbaer erwähnte 64bit-compiler von ms), wird er normalerweise über die größe des zeigers realisiert, damit bspw vector<char> auch den kompletten speicher nutzen kann.



  • OptimzerC schrieb:

    diese zustände will ich iterieren (was schnell gehen muss).

    Woher weißt du, dass das scnellgehen muss? hast du das gemessen oder geschätzt?



  • ghorst schrieb:

    @nexus so kann es definiert werden, wenn int und die größe des zeigers zusammenfallen. aber bei einem compiler, der eine unterschiedliche größen für ints und zeiger hat (wie der von hustbaer erwähnte 64bit-compiler von ms), wird er normalerweise über die größe des zeigers realisiert, damit bspw vector<char> auch den kompletten speicher nutzen kann.

    Aber ist das nicht irgendwo festgelegt? Denn wenn ich im VC++ 2008 mit dem Cursor über size_t fahre, kommt ein Tipp mit typedef unsigned int size_t. Aber die Deklaration konnte ich nicht finden, ist sie in einer Bibliothek? Oder ist das vom Compiler selbst abhängig?

    hustbaer schrieb:

    aber es gibt 64bit compiler, die ein 32bit int definiert haben.

    MSVC zum bleistift

    Ist mir erst jetzt aufgefallen 😃



  • Nexus schrieb:

    Aber ist das nicht irgendwo festgelegt?

    leider nein.

    Nexus schrieb:

    Oder ist das vom Compiler selbst abhängig?

    ja. jeder compiler darf selber entscheiden, wie er das realisiert. er muss nur die c/c++-regeln aus dem standard einhalten.



  • ghorst schrieb:

    size_t sollte nicht so groß wie int sondern wie der systemübliche zeiger sein. das ist auf den meisten systemen haarspalterei, aber es gibt 64bit compiler, die ein 32bit int definiert haben.

    Gibt es denn 64 bit compiler, bei denen int 64 bit hat?



  • wie ich schon schrieb: der gcc nutzt meines wissen nach int mit 64bit.



  • ghorst schrieb:

    wie ich schon schrieb: der gcc nutzt meines wissen nach int mit 64bit.

    nein 🙂
    gcc mit x64 target:

    int 32bit
    long 64bit
    long long 64bit
    

    cl mit x64 target:

    int 32bit
    long 32bit
    long long 64bit
    


  • danke für die korrektur. ich habe keinen gcc für 64bit, sondern las nur, dass dieser erhebliche probleme bereitet und ints mit 64bit veranschlagt. aber das ist offensichtlich falsch. daher ziehe ich meine kommentare zurück.



  • Hi OptimzerC,

    meiner Meinung nach sind das keine Kriterien über die du dir Gedanken machen
    mußt. Wenn es allerdings wirklich so zeitkritisch ist, würde ich eine
    Funktion:

    const std::vector<int>& getStates() const;
    

    machen und dann so drüber iterieren:

    const std::vector<int>& vec = obj->getStates();
    std::vector<int>::const_iterator end = vec.end();
    for(std::vector<int>::const_iterator it = vec.begin(); it!=end; ++it){
    int j = *it;
    }
    

    Das ist glaube ich einen Zeiger-Zugriff schneller als die Adressierung per
    Index. Lasse mich aber auch gerne vom Gegenteil überzeugen ^^
    Alternativ kannst du natürlich auch zwei Methoden in deiner Klasse zur
    Verfügung stellen:

    typedef std::vector<int>::const_iterator const_iterator;
    
    const_iterator begin() const;
    const_iterator end() const;
    
    States::const_iterator end = obj->end();
    for(States::const_iterator it = obj->begin(); it!=end; ++it){
    int j = *it;
    }
    

    EDIT: obj->end() vor for-Schleife gezogen.

    Gruß,
    CSpille


Anmelden zum Antworten