Ich arbeite derzeit an einem numerischen Verarbeitungssystem, das in einer leistungskritischen Umgebung bereitgestellt wird. Es verwendet Eingaben in Form von numerischen Arrays (diese verwenden die eigen
Bibliothek, aber für den Zweck dieser Frage ist dies möglicherweise unerheblich) und führt eine Reihe von numerischen Berechnungen (Matrixprodukte, Verkettungen usw.) durch, um Ausgaben zu erzeugen.
Alle Arrays werden statisch zugeordnet und ihre Größen sind zur Kompilierungszeit bekannt. Einige der Eingaben sind jedoch möglicherweise ungültig. In diesen Ausnahmefällen möchten wir weiterhin, dass der Code berechnet wird, und wir möchten weiterhin, dass Ausgaben verwendet werden, die nicht durch ungültige Werte "verschmutzt" werden.
Nehmen wir als Beispiel das folgende einfache Beispiel (dies ist Pseudocode):
Matrix a = {1, 2, NAN, 4}; // this is the "input" matrix
Scalar b = 2;
Matrix output = b * a; // this results in {2, 4, NAN, 8}
Die Idee hier ist, dass 2, 4 und 8 verwendbare Werte sind, aber das NAN sollte dem Empfänger der Daten signalisieren, dass dieser Eintrag an einer Operation beteiligt war, die einen ungültigen Wert beinhaltete, und verworfen werden sollte (dies wird über a erkannt std::isfinite(value)
prüfen, bevor der Wert verwendet wird).
Ist dies eine gute Möglichkeit, unbrauchbare Werte zu kommunizieren und zu verbreiten, da die Leistung kritisch ist und die Heap-Zuweisung keine Option ist (und andere ressourcenintensive Konstrukte wie boost::optional
oder Zeiger auch nicht)?
Gibt es dafür bessere Möglichkeiten? Zu diesem Zeitpunkt bin ich ziemlich zufrieden mit dem aktuellen Setup, aber ich hatte gehofft, einige neue Ideen oder produktive Kritik an der aktuellen Implementierung zu bekommen.