Tôi hiện đang làm việc trên một hệ thống xử lý số sẽ được triển khai trong môi trường quan trọng về hiệu năng. Nó lấy các đầu vào dưới dạng các mảng số (chúng sử dụng eigen
thư viện, nhưng với mục đích của câu hỏi này có lẽ là phi vật chất) và thực hiện một số tính toán số (sản phẩm ma trận, nối, v.v.) để tạo đầu ra.
Tất cả các mảng được phân bổ tĩnh và kích thước của chúng được biết tại thời điểm biên dịch. Tuy nhiên, một số đầu vào có thể không hợp lệ. Trong những trường hợp đặc biệt này , chúng tôi vẫn muốn mã được tính toán và chúng tôi vẫn muốn đầu ra không bị "ô nhiễm" bởi các giá trị không hợp lệ được sử dụng.
Để đưa ra một ví dụ, hãy lấy ví dụ tầm thường sau đây (đây là mã giả):
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}
Ý tưởng ở đây là 2, 4 và 8 là các giá trị có thể sử dụng được, nhưng NAN cần báo hiệu cho người nhận dữ liệu mà mục nhập đó có liên quan đến một hoạt động liên quan đến giá trị không hợp lệ và cần được loại bỏ (điều này sẽ được phát hiện qua std::isfinite(value)
kiểm tra trước khi giá trị được sử dụng).
Đây có phải là một cách hợp lý để truyền đạt và truyền bá các giá trị không sử dụng được không, cho rằng hiệu suất là rất quan trọng và phân bổ heap không phải là một lựa chọn (và cả các cấu trúc tiêu tốn tài nguyên khác như boost::optional
hoặc con trỏ)?
Có cách nào tốt hơn để làm điều này? Tại thời điểm này, tôi khá hài lòng với thiết lập hiện tại nhưng tôi hy vọng sẽ nhận được một số ý tưởng mới hoặc phê bình hiệu quả về việc triển khai hiện tại.