C++ Lambda的内存布局

Gon*_*n I 3 c++ lambda

为了更好地理解C++ lambdas的实现,我欺骗了编译器将lambda视为一个对象,似乎它们在内存中的布局相同.

注意:这只是为了澄清,我不是在提倡在生产中编写这些类型的黑客

这是由语言规范还是编译器实现细节保证的?

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

}
Run Code Online (Sandbox Code Playgroud)

Max*_*kin 7

该标准不要求lambda闭包具有特定的布局.见[expr.prim.lambda.closure]:

lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型,称为闭包类型,其属性如下所述.

...

闭包类型不是聚合类型.实现可以定义闭包类型与下面描述的不同,前提是这不会改变程序的可观察行为,只需更改:

  • 封闭类型的大小和/或对齐方式,
  • 封闭类型是否可以轻易复制,或者
  • 闭包类型是否为标准布局类.

实现不应将rvalue引用类型的成员添加到闭包类型.