Effektivster Weg, unsigned int in string umzuwandeln



  • SeppJ schrieb:

    Das Limit für BOOST_PP_REPEAT ist derzeit 256, weswegen ich als integralen Datentyp char gewählt habe. Es ist aber natürlich möglich durch automatisch erstellten Code das Makro auf größere Wertbereiche zu erweitern.

    aber auf wie viel größere wertebereiche weist du auch nicht!?

    bb


  • Mod

    unskilled schrieb:

    SeppJ schrieb:

    Das Limit für BOOST_PP_REPEAT ist derzeit 256, weswegen ich als integralen Datentyp char gewählt habe. Es ist aber natürlich möglich durch automatisch erstellten Code das Makro auf größere Wertbereiche zu erweitern.

    aber auf wie viel größere wertebereiche weist du auch nicht!?

    bb

    Das sollte beliebig sein. Es ist eine reine Fleißaufgabe, Makrodefinitionen in dieser Art zu erstellen:

    # define BOOST_PP_REPEAT_1_0(m, d)
    # define BOOST_PP_REPEAT_1_1(m, d) m(2, 0, d)
    # define BOOST_PP_REPEAT_1_2(m, d) BOOST_PP_REPEAT_1_1(m, d) m(2, 1, d)
    # define BOOST_PP_REPEAT_1_3(m, d) BOOST_PP_REPEAT_1_2(m, d) m(2, 2, d)
    # define BOOST_PP_REPEAT_1_4(m, d) BOOST_PP_REPEAT_1_3(m, d) m(2, 3, d)
    # define BOOST_PP_REPEAT_1_5(m, d) BOOST_PP_REPEAT_1_4(m, d) m(2, 4, d)
    # define BOOST_PP_REPEAT_1_6(m, d) BOOST_PP_REPEAT_1_5(m, d) m(2, 5, d)
    // und so weiter
    


  • sry, ich hab natürlich nicht vom makro geredet sondern vom switch^^
    der msvc wollt mir zumindest hier keine fkt für unsigned short compilieren -.-
    das heißt, 2^16(mit default) sind wohl schon zu viel^^
    wenn ich ma wieder bissl lange weile hab, guck ich mal, wie viel er schafft^^

    bb



  • unskilled schrieb:

    sry, ich hab natürlich nicht vom makro geredet sondern vom switch^^
    der msvc wollt mir zumindest hier keine fkt für unsigned short compilieren -.-
    das heißt, 2^16(mit default) sind wohl schon zu viel^^
    wenn ich ma wieder bissl lange weile hab, guck ich mal, wie viel er schafft^^

    bb

    Hast du im Debug- oder Releasebuild kompiliert?
    Der gcc kompiliert das ohne Optimierungen recht flott, im Releasebuild sitzt er aber ewig lange dran.
    Übrigens, sollte immer mindestens genauso performant wie switch sein und auch mit angeschalteten Optimierungen deutlich schneller kompilierbar sein:

    const char* ToString(unsigned short val)
    {
      static const char* strings[65536]={"0","1", ... ,"65535"};
      return strings[val]; 
    }
    


  • Nanyuki schrieb:

    unskilled schrieb:

    sry, ich hab natürlich nicht vom makro geredet sondern vom switch^^
    der msvc wollt mir zumindest hier keine fkt für unsigned short compilieren -.-
    das heißt, 2^16(mit default) sind wohl schon zu viel^^
    wenn ich ma wieder bissl lange weile hab, guck ich mal, wie viel er schafft^^

    bb

    Hast du im Debug- oder Releasebuild kompiliert?
    Der gcc kompiliert das ohne Optimierungen recht flott, im Releasebuild sitzt er aber ewig lange dran.
    Übrigens, sollte immer mindestens genauso performant wie switch sein und auch mit angeschalteten Optimierungen deutlich schneller kompilierbar sein:

    const char* ToString(unsigned short val)
    {
      static const char* strings[65536]={"0","1", ... ,"65535"};
      return strings[val]; 
    }
    

    release^^
    hmm - ok, das wäre vermutlich wirklich sehr viel klüger 😉
    ich habs gerad mal versucht:

    MSVC schrieb:

    fatal error C1128: number of sections exceeded object file format limit : compile with /bigobj

    gesagt, getan...
    dann ging es aber ohne probleme...
    die exe ist eben nur 1MB groß, obwohl sie so ziemlich gar nix macht 😉

    //#define MY_BUILD	1
    #define MY_PATH		"Q:/convert.h"
    
    #include <fstream>
    #include <iostream>
    #include <limits>
    
    void create()
    {
    #if defined(MY_BUILD)
    	std::ofstream str(MY_PATH);
    	str << "const char* ToString(unsigned short nr)" << std::endl
    		<< '{' << std::endl
    		<< "\tstatic const char* strings[] = {\"0\"" << std::endl << "\t\t";
    
    	for(unsigned short i(1); i != 0; ++i)
    	{
    		str << ", \"" << i << "\"";
    		if(i%10 == 0)
    			str << std::endl << "\t\t";
    		if(i%1000 == 0)
    			std::cout << i << " / " << std::numeric_limits<unsigned short>::max() << std::endl;
    	}
    
    	str << std::endl
    		<< "\t};" << std::endl
    		<< "\treturn strings[nr];" << std::endl
    		<< '}' << std::endl
    		<< std::endl;
    #endif
    }
    
    #include "Console/console.hpp"
    #if !defined(MY_BUILD)
    #	include MY_PATH
    #endif
    
    void test()
    {
    #if !defined(MY_BUILD)
    	const char* tmp = ToString(5432);
    	std::cout << tmp << std::endl;
    #endif
    }
    
    int main()
    {
    	create();
    
    	test();
    
    	my::console::wait();
    }
    

    bb



  • volkard schrieb:

    Der Compiler faßt in der Nähe liegende % und / auch selber zusammen, wenn das geht.

    Habe ich auch gedacht, aber da das eine im Schleifenrumpf und das andere in der do while -Bedingung liegt... Vielleicht bin ich allerdings etwas zu vorsichtig, was solche Dinge anbelangt.

    SeppJ schrieb:

    Cool, das kannte ich ja noch gar nicht. Ich sollte mir mal die C Bibliothek genauer angucken, vielleicht gibt es dort ja noch mehr solche Schätze.

    Ja, es gibt einige Dinge in der Standardbibliothek, die man fast nie braucht und kaum mitbekommt. Hast du schon mal von sig_atomic_t ( <csignal> ), inner_product ( <numeric> ) oder indirect_array ( <valarray> ) gehört? Ich stöbere manchmal auf www.cplusplus.com, das ist zum Teil recht interessant.



  • Nexus schrieb:

    SeppJ schrieb:

    Cool, das kannte ich ja noch gar nicht. Ich sollte mir mal die C Bibliothek genauer angucken, vielleicht gibt es dort ja noch mehr solche Schätze.

    Ja, es gibt einige Dinge in der Standardbibliothek, die man fast nie braucht und kaum mitbekommt. Hast du schon mal von sig_atomic_t ( <csignal> ), inner_product ( <numeric> ) oder indirect_array ( <valarray> ) gehört? Ich stöbere manchmal auf www.cplusplus.com, das ist zum Teil recht interessant.

    In "Die C++ Programmiersprache" werden auch eher selten gebrauchte Sachen gezeigt. Fand ich noch ganz nett, dass da viele Sachen angesprochen werden.


Anmelden zum Antworten