Returning std::optional<Result>: Wrapper Local vs Value Local

Question 9 / 12 Correct so far: 0 (0 answered)

Snippet A

Optional Wrapper Local

NOINLINE std::optional<Result> compute(std::uint64_t input) {
    std::optional<Result> result(std::in_place);
    result->label = "result";
    for (std::size_t i = 0; i < kDataSize; ++i)
        result->data[i] = static_cast<double>(input ^ i);
    return result;
}

for (std::uint64_t input : inputs) {
    std::optional<Result> r = compute(input);
    checksum += r->data[input % kDataSize];
}
Snippet B

Optional Value Local

NOINLINE std::optional<Result> compute(std::uint64_t input) {
    Result result{};
    result.label = "result";
    for (std::size_t i = 0; i < kDataSize; ++i)
        result.data[i] = static_cast<double>(input ^ i);
    return result;
}

for (std::uint64_t input : inputs) {
    std::optional<Result> r = compute(input);
    checksum += r->data[input % kDataSize];
}
Shared test data (shared-setup)
struct Result {
    std::string label;
    std::array<double, 1024> data;
};

constexpr std::size_t kDataSize = 1024;
constexpr std::size_t kInputCount = 512;

static std::vector<std::uint64_t> inputs;

struct DataInit {
    DataInit() {
        inputs.reserve(kInputCount);
        for (std::size_t i = 0; i < kInputCount; ++i) {
            inputs.push_back(static_cast<std::uint64_t>(i));
        }
    }
} data_init;

Which snippet is faster?

Select the correct answer(s)