我有以下的C++初始代码:
class Lambda
{
public:
int compute(int &value){
auto get = [&value]() -> int {
return 11 * value;
};
return get();
}
};
int main(){
Lambda lambda;
int value = 77;
return lambda.compute(value);
}
使用clang编译(使用-O1),生成以下汇编代码:
main: # @main
push rax
mov dword ptr [rsp + 4], 77
mov rdi, rsp
lea rsi, [rsp + 4]
call Lambda::compute(int&)
pop rcx
ret
Lambda::compute(int&): # @Lambda::compute(int&)
push rax
mov qword ptr [rsp], rsi
mov rdi, rsp
call Lambda::compute(int&)::{lambda()#1}::operator()() const
pop rcx
ret
Lambda::compute(int&)::{lambda()#1}::operator()() const: # @Lambda::compute(int&)::{lambda()#1}::operator()() const
mov rax, qword ptr [rdi]
mov eax, dword ptr [rax]
lea ecx, [rax + 4*rax]
lea eax, [rax + 2*rcx]
ret
问题:
- 在ASM中出现的
{lambda()#1}
是什么?据我所知,它可能是一个封装函数对象(即lambda主体)的闭包。请确认是否如此。 compute()
每次触发时是否生成一个新的闭包实例?还是同一个实例?
Lambda::compute(int&)::{lambda()#1}::operator()()
是一个已解码的名称;您可能正在使用http://gcc.godbolt.org/而不是查看未经过滤的`clang -O1 -S输出。这里没有什么魔法,只是一个常规的
call`指令。 - Peter Cordesoperator()
本质上具有隐含的this
指针作为上下文传递。可执行堆栈的疯狂操作是为了不传递上下文指针,因为当嵌套函数被用作指针时,它永远无法传递该指针。 - Passer By