免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2557 | 回复: 2
打印 上一主题 下一主题

[C++] 汇编代码分析关于lambda表达式的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-09 22:51 |只看该作者 |倒序浏览
本帖最后由 hongshaohu 于 2014-02-09 22:52 编辑

最近学C++的时候看到lambda表达式这块,这是C++新标准支持的一个特性。
本来以为lambda表达式就相当于一个函数一样,书上也把它当做匿名函数来解释。
但是当我做了一个小小的测试时发现了一个奇怪的问题:当把lambda表达式赋值给一个auto变量时,这个变量的大小居然是1。

请高手解答为什么z1的大小是1???3Q!!!:wink:

以下的所有程序代码是在VS2013中编写的,汇编代码也是VS2013产生的。
具体的程序和main函数部分的汇编代码如下:

// =======================================================================
// 源代码如下
#include "stdafx.h"
#include <iostream>

using namespace std;

void func(){};

int main()
{
        auto z1 = []{};
        cout << sizeof(z1) << endl;

        auto z2 = func;
        cout << sizeof(z2) << endl;

        getchar();
        return 0;
}

// =======================================================================
// 汇编代码如下

int main()
{
012B5580  push        ebp  
012B5581  mov         ebp,esp  
012B5583  sub         esp,0F0h  
012B5589  push        ebx  
012B558A  push        esi  
012B558B  push        edi  
012B558C  lea         edi,[ebp-0F0h]  
012B5592  mov         ecx,3Ch  
012B5597  mov         eax,0CCCCCCCCh  
012B559C  rep stos    dword ptr es:[edi]  
        auto z1 = []{};
        cout << sizeof(z1) << endl;
012B559E  mov         esi,esp  
012B55A0  push        12B139Dh  
012B55A5  mov         edi,esp  
012B55A7  push        1  
012B55A9  mov         ecx,dword ptr ds:[12C0090h]  
012B55AF  call        dword ptr ds:[12C009Ch]  
012B55B5  cmp         edi,esp  
012B55B7  call        __RTC_CheckEsp (012B12EEh)  
012B55BC  mov         ecx,eax  
012B55BE  call        dword ptr ds:[12C00A0h]  
012B55C4  cmp         esi,esp  
012B55C6  call        __RTC_CheckEsp (012B12EEh)  

        auto z2 = func;
012B55CB  mov         dword ptr [z2],12B1109h  
        cout << sizeof(z2) << endl;
012B55D2  mov         esi,esp  
012B55D4  push        12B139Dh  
012B55D9  mov         edi,esp  
012B55DB  push        4  
012B55DD  mov         ecx,dword ptr ds:[12C0090h]  
012B55E3  call        dword ptr ds:[12C009Ch]  
012B55E9  cmp         edi,esp  
012B55EB  call        __RTC_CheckEsp (012B12EEh)  
012B55F0  mov         ecx,eax  
        cout << sizeof(z2) << endl;
012B55F2  call        dword ptr ds:[12C00A0h]  
012B55F8  cmp         esi,esp  
012B55FA  call        __RTC_CheckEsp (012B12EEh)  

        getchar();
012B55FF  mov         esi,esp  
012B5601  call        dword ptr ds:[12C01A0h]  
012B5607  cmp         esi,esp  
012B5609  call        __RTC_CheckEsp (012B12EEh)  
        return 0;
012B560E  xor         eax,eax  
}

论坛徽章:
0
2 [报告]
发表于 2014-02-10 13:53 |只看该作者
本帖最后由 hongshaohu 于 2014-02-10 13:55 编辑

已经找到答案了!其实不用看汇编代码!
lambda表达式最终被翻译为一个类的实例。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
3 [报告]
发表于 2014-02-10 15:27 |只看该作者
我感觉是因为lamba实现为空的原因,
你试一下不为空的情况, 值传递和引用传递都试一下,结果应该是不一样的。

lamba被翻译成类是有可能的,其实lamba的前身就是functor, functor就是类。空类在有些编译器实现上会依然会分配1字节内存单元
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP