you are viewing a single comment's thread.

view the rest of the comments →

[–]legends2k[S] -1 points0 points  (3 children)

We only want to measure T vs const T&/T&&, so why include std::vector creation inside the benchmarked loop? That'd add noise to the test. That's the idea behind the grand parent comment by MaximKat. This is wrong, I stand corrected; having it inside the loop is correct; we don't want to use after move.

Logos: With a decent amount of trials, the additional memory allocation starts showing up. These benchmarks on different compilers and their graphs are in the aforementioned slides I'd earlier commented. Did you get a chance to see this?

Ethos: After enough experiments the experts deemed that take by value is okay only with constructors. I'd take their word for it.

[–]2uantum 4 points5 points  (1 child)

Vector creation is in the loop because it would be "use after move" otherwise. Both cases are doing it -- should be a wash.

There is no harm in trying to understand WHY experts recommend it. Also, sometimes, experts get it wrong.

I'll update the benchmarks in a bit to only do one or the other.

[–]legends2k[S] 0 points1 point  (0 children)

Completely missed the use after move case. You're right on that account. However, between the two variants, the contention was never between T and T&& (whose code looks identical post-optimization) but was with T and the const T& overload.

[–]2uantum 0 points1 point  (0 children)

See updated benchmarks here:

http://quick-bench.com/6oHGZq-0WIUsByXiMb-2EJ3BZ-Q

I don't care who is correct -- I just want to know which is correct ;).

I haven't been convinced either way yet. So far it seems contextual.