3 votes

L'adresse mémoire de la variable locale change en fonction de la présence des paramètres de la lambda

J'ai le code suivant avec lequel je jouais. J'ai une variable locale p et j'ai une lambda qui imprime son adresse :

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

    lambda(); // 0x7fff78e6b7e0
}

L'adresse de la variable est la même peu importe combien de fois je cours le code. Mais je remarque que lorsque je change la définition de la lambda comme ceci :

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

C'est-à-dire quand j'ajoute une liste de paramètres vide, j'obtiens une nouvelle adresse :

lambda(); // 0x7fff2291a260

Vous pouvez le tester ici. Pourquoi cela arrive-t-il ? Je fais tourner mon code à la fois sur g++-4.8 et clang++ sur Windows.

4voto

Ivan Grynko Points 1954

Le changement d'adresse est absolument ok. Le compilateur peut générer un code différent pour vos lambdas. Le système d'exploitation peut charger votre programme à une adresse de base différente.

Vous pouvez vous assurer que l'adresse de la variable est la même, que la liste de paramètres ait été spécifiée ou non :

#include 

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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X