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

时间:2013-10-03 13:46:53

标签: c++

我正在使用以下代码。我有一个局部变量p,我有一个lambda打印出它的地址:

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

    lambda(); // 0x7fff78e6b7e0
}

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

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

当我添加一个空参数列表时,我得到一个新地址:

lambda(); // 0x7fff2291a260

您可以测试over here。为什么会这样?我在Windows上运行g ++ - 4.8和clang ++上的代码。

1 个答案:

答案 0 :(得分:4)

地址变更绝对可以。编译器可能会为您的lambdas生成不同的代码。操作系统可能会在不同的基址加载您的程序。

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

#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
}