Ga naar inhoud

C++: korte vragen


anoniem

Aanbevolen berichten

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!
Link naar reactie
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.
Link naar reactie
[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.
Link naar reactie
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!
Link naar reactie
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).
Link naar reactie
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]
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...