Returning a Named Local: Plain Return vs std::move Return

Question 10 / 17 Correct so far: 0 (0 answered)

Snippet A

Plain Return

NOINLINE Buffer buildBuffer(std::uint64_t seed) {
    Buffer buf;
    for (std::size_t i = 0; i < buf.data.size(); ++i)
        buf.data[i] = static_cast<double>(seed ^ i);
    return buf;
}

for (std::uint64_t input : inputs) {
    Buffer b = buildBuffer(input);
    checksum += b.data[input % 1024];
}
Snippet B

Move Return

NOINLINE Buffer buildBuffer(std::uint64_t seed) {
    Buffer buf;
    for (std::size_t i = 0; i < buf.data.size(); ++i)
        buf.data[i] = static_cast<double>(seed ^ i);
    return std::move(buf);
}

for (std::uint64_t input : inputs) {
    Buffer b = buildBuffer(input);
    checksum += b.data[input % 1024];
}
Shared test data (shared-setup)
struct Buffer {
    std::array<double, 1024> data;
};

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) * 6364136223846793005ULL + 1);
    }
} data_init;

Which snippet is faster?

Select the correct answer(s)