Back To Schedule

Zero overhead pass by value through invocable abstractions

16:30 - 17:15 Wednesday 1st May 2024 MT Flug Auditorium
Intermediate
Generic/Metaprogramming

This presentation focuses on what happens when non-trivial objects are passed to functions by value. Often this necessitates calling the copy or move constructor of the object's type. This call can be elided when the argument is a prvalue, such as when it is the result of another function or a temporary object of the expected type. The constructor can be elided even if the target function happens to be virtual.

But this doesn't work when invoking a std::function, std::move_only_function, std::function_ref, or even std::reference_wrapper. When the target of these abstractions takes objects by value, there will be at least one additional copy/move of the arguments even if they are prvalues.

But what if this were not the case?

This presentation will explain why library-level abstractions incur the overhead of an additional copy/move, and present a technique for avoiding this overhead. The following extreme example proves the point:

function<void(lock_guard by_value)>([](lock_guard by_value){});

View Slides

Filipp Gelman

Bloomberg LP

At Bloomberg LP since 2016, Filipp enjoys exploring the obscure, arcane, and esoteric corners of the C++ language. He is known among his coworkers for heavy use of templates, emphasis on compile time computation, and abusing language features for nefarious purposes.