assert 3 fragen
-
Hallo,
ich bin neu und habe 3 Fragen:
-
Sind asserts langsam - also bremsen sie die performance eines programms deutlich? sind diese wie eine if-abfrage?
-
kann man asserts zentral abschalten aus dem code wie z.B. debug-info über präprozessor-direktiven? Wenn ja wie? oder muss man z.B. vor auslieferung eines programms alle asserst löschen?
-
worin liegt der unterschied zwischen asserst und einer gewöhlichen if-abfrage? Nur darin dass eine Meldung ausgegeben wird? Was ist der Sinn von asserts?
danke euch

-
-
mousepad schrieb:
- Sind asserts langsam - also bremsen sie die performance eines programms deutlich? sind diese wie eine if-abfrage?
Asserts sind im Release-Modus (wenn NDEBUG gesetzt ist) "garnicht", werden also komplett aus dem Programm entfernt. Im Debug-Modus sollte man die Performancefrage aussen vor lassen.
- kann man asserts zentral abschalten aus dem code wie z.B. debug-info über präprozessor-direktiven? Wenn ja wie? oder muss man z.B. vor auslieferung eines programms alle asserst löschen?
siehe oben
- worin liegt der unterschied zwischen asserst und einer gewöhlichen if-abfrage? Nur darin dass eine Meldung ausgegeben wird? Was ist der Sinn von asserts?
a) siehe oben
b) assert macht eine Ausgabe
c) assert beendet das Programm
-
danke erstmal für die antwort.
Aber wie soll ich das verstehen - sie sind "gar nicht". Muss ich dazu dann jedes assert per hand rauslöschen wenn ich einen release plane? Da kann ich doch gleich eine präprozessor-direktive mit einer if-abfrage machen oder nicht?Für weitere aufklärung wäre ich dankbar
-
Ich wollte damit sagen, dass asserts im Release-Modus nicht mehr vorhanden sind. Ich habe nicht gesagt, dass Du sie dafür manuell löschen musst.
Im Grunde sieht assert so aus:
#if !defined(NDEBUG) # define assert(x) __builtin_assert(x) #else # define assert(x) #endifDer Teil im if-Zweig, also wie assert implementiert ist, ist dabei uninteressant, wichtig ist, dass im else-Zweig (also wenn NDEBUG gesetzt ist) assert(...) durch nichts ersetzt (sprich: entfernt) wird, und damit auch keinen Code erzeugt.
-
danke - muss dieser 5-zeiler dann in jeder datei stehen bzw. überall erreichbar sein?
Was passiert wenn ich diesen 5-zeiler nicht eintrage und einfach assert(...) schreibe an den stellen?verstehe ich das richtig dass ich zuerst den 5-zeiler definieren muss.
Dann einfach an irgendeine stelle im code assert(x > 5) z.B. ohne präprozessor-flags und dann im release mode einfach drüberkompilieren - sind die asserts dann draußen? Ist NDEBUG eigens definiert oder vom compiler als flag bekannt?
-
mousepad schrieb:
...
Ja, das musst Du überall reinschreiben. Außerdem noch
#ifdef TROLL_VERSUCH assert("Gescheitert.") #endif
-
mousepad schrieb:
danke - muss dieser 5-zeiler dann in jeder datei stehen bzw. überall erreichbar sein?
Lies einfach die Doku zu assert.
Ist ja furchtbar was du hier aufführst...assert ist im Release Modus nicht mehr vorhanden, im Debug Modus schon.
Da es ein Teil der Standard Library, wie zB auch std::cout ist, musst du (wie bei std::cout) die Implementierung (oh wunder) nicht selber vornehmen.