Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

C++: korte vragen

Anoniem
None
6 antwoorden
  • Hoi!

    Ik ben een C++-beginner en heb enige vragen voor iemand die er meer vanaf weet!

    1. De set_new_handler() uit <new.h> lijkt mij zeer makkelijk in gebruik. Kan ik deze functie echter meerdere keren gebruiken, d.w.z. in elke class die ik maak er 1 definieren? Of mag het er per definitie maar 1 zijn (en zou die dus, als je meerdere classes gebruikt, in de main() moeten komen te staan)? Of grijpt C++ naar de new_handler van de class waarin de fout zich heeft voorgedaan?

    2. memset(): in welke gevallen is deze functie zinnig? Als je variabelen, bijvoorbeeld in een loop, opnieuw gebruikt ofzo? Ik kom ook wel eens code tegen waar alle structs ge-memset worden, maar waarom precies?

    3. De string-class. Voor zover ik weet is C nog altijd sneller dan C++ qua performance. Dat geldt dus ook voor de string-klasse, naar ik aanneem - d.w.z.: gebruik van std::string ipv gewone char * vergt meer rekentijd en geheugen? Het gaat natuurlijk maar om microseconden of is het "erger". Kortom, is std::string echt trager dan de char * of is dit verschil verwaarloosbaar?

    Bij voorbaat dank!
  • 3. Als je 5000 strings moet maken voor bijv een grote database kan het aanroepen voor al die constructors best veel tijd duren. Daarbij als je een char array of char pointer gebruikt, wordt er alleen een variable gemaakt. Het is net zoiets als auto_ptr, als je er (te) veel van gebruikt gaat het merkbaar langzamer dan normale pointers.
  • [i:121c1eb638]memset[/i:121c1eb638] wordt gebruikt om variabelen te initialiseren naar een gedefinieerde waarde. Bij gewone variabelen lukt dat nog wel tijdens de declaratie zoals in [code:1:121c1eb638]int i=0;[/code:1:121c1eb638]Bij structs lukt dat niet omdat je ieder element van een struct door moet bij het uitvoeren van de code. [i:121c1eb638]memset[/i:121c1eb638] houdt het geheel overzichtelijk en werkt veel sneller omdat je met een pointer werkt.
  • Wim & microchip,

    Dank voor jullie antwoorden - verhelderend! Ik heb nog een extra vraag; wellicht weten jullie ook hiervoor een antwoord?

    De vraag: wat is 'beter' en 'sneller', memcmp/memcpy of strcmp/strcpy? Ik weet dat je bij de mem's de omvang moet weten, maar als je die hebt, zijn de mem-functies dan sneller dan de stringfuncties? Intuitief zou ik ja zeggen, omdat de stringfuncties volgens mij karakter voor karakter langs gaan, en de mem-functies zich 'gewoon' baseren op de geheugenadressen. Maar klopt dit enigszins? Of maatk het qua performance weinig uit?

    Dank!
  • Dat kun je zelf testen. Doe1.000.000 strcpy's en 1.000.000 memcpy's en 'meet' de tijd.
    strcpy werkt alleen op strings omdat het doorgaat totdat de string terminator ('\0') gevonden is:
    * kopieer 1 karakter,
    * controleer of het '\0' is
    * pointer ophogen
    * opnieuw

    Voor memcpy:
    * init teller
    ** kopier 1 karakter
    ** verlaag en test teller
    ** pointer ophogen
    ** opnieuw

    Het grootste verschil is dat je met memcpy alles kunt kopieren wat je maar wilt en met strcpy alleen maar strings (tenzij je onvoorspelbare resultaten wilt).
  • Ik heb meteen een test gemaakt. Beetje anders dan je voorstelde maar voor zover ik weet wel representatief. Ik heb de code twee keer voor zowel strcpy() als memcpy() onder identieke omstandigheden laten lopen. Resultaat: strcpy() had 86.359 en 86.125 clock cycles nodig en memcpy() 70.359 en 70.281 cycles. Laatste is dus (stuk) sneller.

    De gebruikte code:
    [code:1:72c73db3bd]
    // Gecompileerd met mingw's g++

    #include <time.h>
    #include <iostream>
    #include <limits.h>

    // Test met strcpy()

    int main ( int argc, char **argv )
    {
    char const *from = "Kopieer deze string";
    unsigned length = strlen(from) + 1;
    char to[length];

    std::cout << "strcpy(): ";
    clock_t starttime = clock();
    for ( unsigned long idx = 0; idx < ULONG_MAX; ++idx )
    strcpy(to, from);
    std::cout << clock() - starttime << std::endl;

    return 0;
    }


    /*
    // Test met memcpy()

    int main ( int argc, char **argv )
    {
    char const *from = "Kopieer deze string";
    unsigned length = strlen(from) + 1;
    char to[length];

    std::cout << "memcpy(): ";
    clock_t starttime = clock();
    for ( unsigned long idx = 0; idx < ULONG_MAX; ++idx )
    memcpy(to, from, length);
    std::cout << clock() - starttime << std::endl;

    return 0;
    }
    */
    [/code:1:72c73db3bd]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.