Yes, std::function is a fairly inefficient class. It's useful for
storing a lambda but not so much for passing it around. You can pass
around lambdas as a template argument (requires all callees to be
templates) or as a function pointer if there are no captures. If you
have captures a helper class such as llvm::function_ref[1] might come
in handy, which acts like a function pointer but also allows captures
to be passed around.

[1] 
https://github.com/llvm-mirror/llvm/blob/master/include/llvm/ADT/STLExtras.h#L80

On Mon, Oct 24, 2016 at 8:32 PM, Jens Alfke via cfe-users
<cfe-users@lists.llvm.org> wrote:
> I’ve started using C++11 lambdas in my code. A few of them are in 
> performance-sensitive areas, so I was looking at (optimized) assembly code of 
> some of my methods to see what goes on under the hood.
>
> I don’t entirely understand the code, but the code on the calling side (i.e. 
> the part that creates the lambda and passes it as a function parameter) it 
> looks larger and slower than similar code using Clang blocks. It looks as 
> though there’s overhead in converting the lambda itself into a std::function 
> object … especially because I see a call to a std::function method that makes 
> a heap allocation. :'( The equivalent block-based code just fills out a small 
> struct on the stack and passes its address.
>
> Is there a more efficient way to pass a lambda to a function in C++? As far 
> as I can tell, a lambda is of an anonymous type that can’t be named*, so the 
> only way to pass it as a parameter is to wrap it in a std::function, which is 
> comparatively expensive.
>
> (My code has to be cross-platform, but I’m thinking of writing some macros 
> that can expand into either lambda or block expressions, depending on the 
> compiler. That way it’ll at least be more efficient when built with Clang.)
>
> —Jens
>
> PS: This is with Xcode 8, clang-800.0.38
>
> * Ironically, my copy of the Tao Te Ching just arrived from Amazon while I 
> was writing this email, and it starts right off with the famous statement 
> “The way you can go isn’t the true way. The name you can say isn’t the true 
> name.”
> _______________________________________________
> cfe-users mailing list
> cfe-users@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
_______________________________________________
cfe-users mailing list
cfe-users@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users

Reply via email to