局部变量的内存地址根据 lambda 参数的预感而变化

Memory address of local variable changes depending on the presense of lambda parameters

本文关键字:参数 预感 变化 lambda 内存 地址 局部变量      更新时间:2023-10-16

我有以下代码。我有一个局部变量p,我有一个打印出其地址的lambda:

int main()
{
    int p = 0;
    auto lambda = [&p] {
        std::cout << &p << std::endl;
    };
    lambda(); // 0x7fff78e6b7e0
}

无论我运行代码多少次,变量的地址都是相同的。但是当我将 lambda 定义更改为此定义时,我发现:

auto lambda = [&p]() {
//                ^^

这意味着当我添加一个空参数列表时,我会得到一个新地址:

lambda(); // 0x7fff2291a260

你可以在这里测试一下。为什么会这样?我在 Windows 上的 g++-4.8 和 clang++ 上运行我的代码。

地址更改绝对没问题。编译器可能会为您的 lambda 生成不同的代码。操作系统可能会在不同的基址加载您的程序。

无论是否指定参数列表,都可以确保变量地址相同:

#include <iostream>
int main()
{
    int p = 0;
    auto lambda1 = [&p] {
        std::cout << &p << std::endl;
    };
    auto lambda2 = [&p] (){
        std::cout << &p << std::endl;
    };
    lambda1(); //0x7fffe3034fb4
    lambda2(); //0x7fffe3034fb4
}