只需要在lambda中填充足够的内容并至少使用两次即可(否则,没有充分的理由不进行内联)。
此处带有-O3
的GCC 9.2和Clang 9:
#include<iostream>
int a,b,c;
template <typename F>
static inline void
hof(const F fun) {
fun(a,c);
fun(a,c);
}
void caller() {
hof([&](int a,int b,int c) {
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
std::cout << "Hello!";
});
}
caller
的程序集如下所示:
海湾合作委员会:
caller():
sub rsp,8
call caller()::{lambda(int,int,int)#1}::operator()(int,int) const [clone .isra.0]
call caller()::{lambda(int,int) const [clone .isra.0]
add rsp,8
ret
C语:
caller(): # @caller()
push rax
call caller()::$_0::operator()(int,int) const
pop rax
jmp caller()::$_0::operator()(int,int) const # TAILCALL
请参阅“ here”。
在我说服GCC两次内联不值得的情况下,这些正是lambda中的重复次数。
Clang已经停止内联,重复次数更少。
本文链接:https://www.f2er.com/3169550.html