C++嵌套Lambda函数传递参数地址重复问题咨询
C++嵌套Lambda调用中参数地址重复的原因解析
问题场景与代码
在学习C++ Lambda时发现嵌套Lambda调用出现参数地址异常的现象,测试代码如下:
#include <iostream> using namespace std; int x{10}; // assume x has 0x1 address here cout << "SCOPE: x address: " << &x << endl; // showing 0x1 for x address auto show = [](int x) { cout << "SHOW: x address: " << &x << endl; }; cout << "SCOPE: show-lambda address: " << &show << endl; show(x); // showing 0x2 for x address auto fv = [x, show]() { cout << "FV : x address: " << &x << " " << endl; // 0x3 cout << "FV : show-lambda address:" << &show << endl; show(x); // showing 0x4 for x address }; auto fr = [&x, show]() { cout << "FR : x address: " << &x << " " << endl; // showing 0x1 for x address cout << "FR : show-lambda address:" << &show << endl; show(x); // showing 0x4 for x address - WHY??? }; fv(); fr();
运行输出
SCOPE: x address: 0x39f95c SCOPE: show-lambda address: 0x39f95b SHOW: x address: 0x39f928 FV : x address: 0x39f950 FV : show-lambda address:0x39f954 SHOW: x address: 0x39f8f8 FR : x address: 0x39f95c FR : show-lambda address:0x39f948 SHOW: x address: 0x39f8f8
核心疑问
全局作用域的x地址为0x39f95c,fr按引用捕获x,内部x地址保持原地址,但调用show后,show内的x地址却和fv中调用show时的x地址(0x39f8f8)完全相同。已知Lambda会被编译为类对象,fv和fr中的show是不同实例,为何会出现该现象?
原因解析
show的参数传递方式是关键:show的参数是按值传递的,每次调用show(x)时,传入的实参会被拷贝到show函数的局部参数x中,这个局部参数是在栈上分配的临时空间。- 栈空间的复用特性:
fv()执行完毕后,它占用的栈帧会被释放,栈指针会回退到之前的位置。当fr()执行到show(x)时,栈上的可用空闲位置刚好和fv()中调用show时的位置一致,因此分配给show局部参数x的地址就会重复。 show实例的差异不影响栈地址分配:虽然fv和fr中的show是不同的拷贝实例,但它们的调用逻辑完全一致——都是执行“接收值参数并在栈上创建局部变量”的操作。两次show调用的栈上下文(栈的当前状态)恰好相同,导致局部变量地址重合,这是栈空间复用的正常行为,和show是否为不同实例无关。
内容的提问来源于stack exchange,提问作者Vlad Zhukovsky
相关产品推荐
相关产品推荐

