堆栈内存中的c ++ lambda

时间:2016-09-20 07:46:27

标签: c++ c++11 visual-c++

lambda类型的局部变量指针有一个0xcc 0xcc 0xcc 0xcc

没有初始化局部变量统计数据

int main()
{
    auto a = []()
    {
       printf("aa");
    };

    a();

    int b = 1;

    return 0;
}

在visual studio中,观看变量& a in break point show

&a  0x0113f8d7 {...}    main::__l2::void <lambda>(void) *

0x0113F8D7  cc cc cc cc  ????
0x0113F8DB  cc cc cc cc  ????

否则,&amp; b显示

&b  0x0113f8c8 {0x00000001} int *

0x0113F8C8  01 00 00 00  ....

我在调用未初始化的lambda函数的位置或方式

2 个答案:

答案 0 :(得分:5)

C ++标准要求完整对象的大小大于0(空基类子对象可以占用0个字节)。

lambda对象a是无状态的(因为它什么都没有捕获),但是它不能是零大小,所以它的大小是1.这一个字节的内容没有定义,因为那里没有任何东西存储

请注意,只要程序无法观察到差异,编译器就可以根本不为它分配存储空间。

答案 1 :(得分:2)

lambda不是函数指针。这是一堂课。此代码等效于以下内容:

<?php 
if(($this->uri->segment(1)=='reports') || ($this->uri->segment(2)=='manageflyers' && $this->uri->segment(3)=='save')){ 
    //do nothing
 }else{
    //some js code
 } 

“a_lambda”是内部生成的唯一类名,由编译器生成。

该类不包含任何内容且没有类成员,因此当您查看class a_lambda { public: void operator()() { printf("aa"); } }; a_lambda a; 时,您看到的只是未初始化的内存。