Destruktor für einfache Linked List, Speicherverwaltung
-
@Jockelx Ich glaube, @Swordfish geht es hierum (auch wenn man lesen ohne ß schreibt und Horst ein normaler Name ist):
root [0] stringstream ss("-1"); root [1] unsigned u{}; root [2] ss >> u; root [3] u (unsigned int) 4294967295 root [4] (bool) ss (bool) true
Das darf einen schon überraschen. Ich frage mich ernsthaft, wer sich warum dieses Verhalten ausgedacht hat. Nur: das wrappt immer weit in den Riesengroß-Bereich und daher fängt man es mit einem Kleiner-als-Max-Check üblicherweise.
-
@SeppJ sagte in Destruktor für einfache Linked List, Speicherverwaltung:
Das gilt auch in allen anderen Fällen. Was sind denn die Vorteile, wenn man unsigned benutzt? Keine. Denn die Aussage, dass man nicht mehr Validieren muss, muss geändert werden zu dass man nicht mehr validieren kann, egal ob man muss oder nicht.
Mein Beispiel hast Du wohl nicht gelesen?
-
Weiteres dazu:
Don't use unsigned for quantities [YouTube, 6:07 min]
CppCoreGuidelines on using unsignedP.S.: Kann natürlich jeder machen, wie er es für richtig hält
Mein ursprünglicher Kommentar sollte lediglich ein gut gemeinter Hinweis sein, und keine ewige Diskussion entfachen.
-
@HarteWare sagte in Destruktor für einfache Linked List, Speicherverwaltung:
Mein ursprünglicher Kommentar sollte lediglich ein gut gemeinter Hinweis sein, und keine ewige Diskussion entfachen.
Ist doch schön, wenn aus einem Kommentar eine Diskussion entsteht.
Zumindest ich hab was gelernt (dachte es wäre recommented z.B. size_t in einem Ctor zunehmen, wenn ich sagen will, dass nur ein unsigned sinnvoll ist).
-
@wob sagte in Destruktor für einfache Linked List, Speicherverwaltung:
@Jockelx Ich glaube, @Swordfish geht es hierum
Blitzgneißer!
@wob sagte in Destruktor für einfache Linked List, Speicherverwaltung:
und daher fängt man es mit einem Kleiner-als-Max-Check üblicherweise.
nein, tut man nicht weils nicht zuverlässig funktionieren kann.
-
@Swordfish Das kannst Du doch sicherlich an Hand eines Beispiels erläutern.
-
@mgaeckler sagte in Destruktor für einfache Linked List, Speicherverwaltung:
@Swordfish Das kannst Du doch sicherlich an Hand eines Beispiels erläutern.
Ist das nicht offensichtlich? Wie unterscheidest du legitime Werte von gewrappten Werten? Gar nicht!
-
@Swordfish sagte in Destruktor für einfache Linked List, Speicherverwaltung:
nein, tut man nicht weils nicht zuverlässig funktionieren kann.
Natürlich kann es zuverlässig funktionieren. Und zwar dann, wenn man einen solchen unsinged-Typ wählt, dessen maximaler gültiger Wert kleiner als die Hälfte des maximal darstellbaren Wertes ist. Dann wrappen alle negativen Zahlen in wesentlich zu große Werte.
Und wenn ich an einen vector-Index mit 64-Bit size_t denke, ist das immer erfüllt. So riesige vectoren habe ich einfach nicht.
-
Dieser Beitrag wurde gelöscht!
-
@wob sagte in Destruktor für einfache Linked List, Speicherverwaltung:
@Swordfish sagte in Destruktor für einfache Linked List, Speicherverwaltung:
nein, tut man nicht weils nicht zuverlässig funktionieren kann.
Natürlich kann es zuverlässig funktionieren. Und zwar dann, wenn man einen solchen unsinged-Typ wählt, dessen maximaler gültiger Wert kleiner als die Hälfte des maximal darstellbaren Wertes ist. Dann wrappen alle negativen Zahlen in wesentlich zu große Werte.
Das sind aber sehr spezifische Voraussetzungen, wenn doch die mit weitem Abstand häufigste Bedingung "nur positive Werte" ist (welche die Voraussetzungen offensichtlich nicht erfüllt).
-
@SeppJ Können wir uns darauf einigen:
Wenn nur 0 und positive Zahlen erlaubt sind und ich einen maximal gültigen Wert habe, gegen den ich meine (Zwischen)ergebnisse/Parameter prüfen kann, dann kann man/frau bedenkenlos unsigned Typen nehmen. Habe ich das nicht, aber es genügt der positive Wertebereich des signed Typen, sollten signed Typen bevorzugt werden.
-
@mgaeckler sagte in Destruktor für einfache Linked List, Speicherverwaltung:
@SeppJ Können wir uns darauf einigen:
Wenn nur 0 und positive Zahlen erlaubt sind und ich einen maximal gültigen Wert habe, gegen den ich meine (Zwischen)ergebnisse/Parameter prüfen kann, dann kann man/frau bedenkenlos unsigned Typen nehmen. Habe ich das nicht, aber es genügt der positive Wertebereich des signed Typen, sollten signed Typen bevorzugt werden.Aber: Warum? Du hast dann nichts gewonnen, hast immer noch den gleichen Wertebereich. Dafür aber ungewöhnliche Programmiermuster und schwerer verständlichen Code, der wahrscheinlich sogar eines Kommentars bedarf.
-
@SeppJ Weil ich sonst beim Prüfen auf negative und zu große Werte prüfen muß.
-
@mgaeckler sagte in Destruktor für einfache Linked List, Speicherverwaltung:
@SeppJ Weil ich sonst beim Prüfen auf negative und zu große Werte prüfen muß.
Und? Du hast dafür einfachen, verständlichen Code gegen unverständlichen und fehleranfälligen Code getauscht. Vorher dokumentierte der Code selbstständig dein Vorhaben. Nun bedarf dein Code einer zusätzlichen Dokumentation und ständiger Prüfung deiner Annahmen über die Integergröße und das Überlaufverhalten.
-
@SeppJ Was soll daran unverständlich sein? Ungewöhnlich ist das nur, wenn man von Java her kommt. Weil dort ist das unbekannt.
-
@mgaeckler sagte in Destruktor für einfache Linked List, Speicherverwaltung:
@SeppJ Was soll daran unverständlich sein? Ungewöhnlich ist das nur, wenn man von Java her kommt. Weil dort ist das unbekannt.
Du willst prüfen, ob die Eingabe zwischen 0 und X liegt. Was drückt dies besser aus?
if (input >= 0 and input < X) ...
oder
assert(X < std::numeric_limits<typeof(x)>::max() / 2); if (input < X) ...
?
Und du kannst weiterhin das gleiche Muster nicht auf den viel häufigeren Fall anwenden, dass deine Bedingung nur
input > 0
ist. Du musst also genau wissen, dass deine Bedingung für immer von genau diesem Typ ist, und dass deine Assertion auf dem System richtig ist. Wenn sich deine Bedingung ändert oder die Assertion nicht mehr stimmt, musst du auf einmal das ganze Konzept ändern. Toller Scheiß. Nur damit du sagen kannst, dass du eine andere Abfrage benutzt hast, bloß weil du es konntest.
-
@wob sagte in Destruktor für einfache Linked List, Speicherverwaltung:
Natürlich kann es zuverlässig funktionieren. Und zwar dann, wenn man einen solchen unsinged-Typ wählt, dessen maximaler gültiger Wert kleiner als die Hälfte des maximal darstellbaren Wertes ist. Dann wrappen alle negativen Zahlen in wesentlich zu große Werte.
omfg. Niemand hier (hoffe ich) muss das Offensichtliche von dir erklärt bekommen. Die Frage ist nach dem Sinn. N/A.