C/C++:lambda
1445 ワード
すばらしい文章ですが、直接転送することをお勧めします.https://shaharmike.com/cpp/lambdas-and-functions/そして...もっと言えば、lambda式は最後に実行を表す括弧がない限り、実際にはオブジェクトです.
[...] で取得した変数または参照は、オブジェクト内のメンバー変数です(参照はメンバー変数になりますか?参照が取得された後、スペースの大きさがポインタの特性として表現されるようにテストされました).
このことから,lambdaオブジェクトにおけるメンバー変数のメモリレイアウト(参照変数はポインタとして表現される)は,実際には通常の構造体バイトコードに従って規則的に区分されていることがわかる.
私の推測では、lambda式で取得された変数または参照はローカルライフサイクルしか持たない(つまり、関数内のローカル変数しか取得できない)ため、lambda式のオブジェクトは関数内でインスタンス化されています.(つまりスタックメモリに存在する)一方、lambda式が入力するパラメータもスタックに存在するため、lambda式が取得した変数とそれに入力するパラメータは同じストレージ領域内にある.
int main()
{
int a;
int b;
char c;
char d;
auto func = [&a, b, &c, d ](int i, int j){std::cout << i+j << std::endl;};
// ,func
void (*q)();
q = func;
// , void func , 3
void* p = &func
(*p)(1, 2);
}
[...] で取得した変数または参照は、オブジェクト内のメンバー変数です(参照はメンバー変数になりますか?参照が取得された後、スペースの大きさがポインタの特性として表現されるようにテストされました).
int main()
{
int a;
int b;
char c;
char d;
auto func = [&a, b, &c, d](int i, int j){};
std::cout << sizeof(func) << std::endl;
}
// 32
int main()
{
int a;
int b;
char c;
char d;
auto func = [a, b, &c, d](int i, int j){};
std::cout << sizeof(func) << std::endl;
}
// 24
int main()
{
int a;
int b;
char c;
char d;
auto func = [c, d, a, b](int i, int j){};
std::cout << sizeof(func) << std::endl;
}
// 12
このことから,lambdaオブジェクトにおけるメンバー変数のメモリレイアウト(参照変数はポインタとして表現される)は,実際には通常の構造体バイトコードに従って規則的に区分されていることがわかる.
私の推測では、lambda式で取得された変数または参照はローカルライフサイクルしか持たない(つまり、関数内のローカル変数しか取得できない)ため、lambda式のオブジェクトは関数内でインスタンス化されています.(つまりスタックメモリに存在する)一方、lambda式が入力するパラメータもスタックに存在するため、lambda式が取得した変数とそれに入力するパラメータは同じストレージ領域内にある.