- 论坛徽章:
- 0
|
本帖最后由 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
}
|
|