Расположение памяти C ++ Lambda - PullRequest
0 голосов
/ 07 июня 2018

Пытаясь лучше понять реализацию лямбда-выражений C ++, я одурачил компилятор трактовкой лямбды как объекта, и кажется, что они размещаются в памяти одинаково.

Примечание : это только для пояснения, я не защищаю от написания подобных взломов в производстве

Это гарантировано спецификацией языка или подробностями реализации компилятора?

struct F
{
    int a;  int b;  int c;
    void printLambdaMembers()
    {
        cout << this << endl; // presumably the lambda 'this'
        cout << a << endl; // prints 5   
        cout << b << endl;
        cout << c << endl;
    }
};

void demo()
{
    int a = 5;
    int b = 6;
    int c = 7;
    auto lambda = [a,b,c]() { cout << "In lambda!\n";  };
    // hard cast the object member function pointer to the lambda function 
    void(decltype(lambda)::*pf)() const = (void(decltype(lambda)::*)() const) (&F::printLambdaMembers);
    // run the member function on the lambda pointer
    (lambda.*pf)();  // we get 5,6,7

}

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Конкретная реализация.

Более того, в вашем случае захват лямбды не используется, поэтому может быть даже исключен ...

0 голосов
/ 07 июня 2018

Стандарт не требует, чтобы лямбда-затворы имели определенную компоновку.См. [expr.prim.lambda.closure]:

Тип лямбда-выражения (который также является типом объекта замыкания) - это уникальный, безымянный тип класса без объединения, называемыйтип замыкания, свойства которого описаны ниже.

...

Тип замыкания не является агрегатным. Реализация может определять тип замыкания иначе, чем описано ниже , при условии, что это не изменяет наблюдаемое поведение программы, кроме как путем изменения:

  • размера и / или выравниваниятипа закрытия:
  • , является ли тип закрытия тривиально копируемым, или
  • , является ли тип закрытия классом стандартной компоновки.

Реализация не должнадобавить члены ссылочного типа rvalue в тип закрытия.

0 голосов
/ 07 июня 2018

Это полностью определяется реализацией.
Однако, поскольку лямбды являются просто экземплярами классов, имеет смысл, что они будут сгенерированы компилятором так, чтобы они выглядели как любой другой класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...