코드

#include "stdafx.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
 int a1;
 int a2;
 int a3;
 int a4;

 printf("a1 : %p\n", &a1);
 printf("a2 : %p\n", &a2);
 printf("a3 : %p\n", &a3);
 printf("a4 : %p\n", &a4);

 auto lambda1 = [a1]{ printf("lambda1(a1) : %p\n", &a1); };
 printf("lambda1 : %p\n", &lambda1);
 lambda1();

 auto lambda2 = [&a1]{ printf("lambda2(&a1) : %p\n", &a1); };
 printf("lambda2 : %p\n", &lambda2);
 lambda2();

 auto lambda3 = [&a1, &a2]{ printf("lambda3(&a1, &a2) : %p, %p\n", &a1, &a2); };
 printf("lambda3 : %p\n", &lambda3);
 lambda3();

 auto lambda3_1 = [a1, a2]{ printf("lambda3_1(&a1, &a2) : %p, %p\n", &a1, &a2); };
 printf("lambda3_1 : %p\n", &lambda3_1);
 lambda3_1();

 auto lambda4 = [=]{ printf("lambda4(=) : %p, %p, %p, %p\n", &a1, &a2, &a3, &a4); };
 printf("lambda4 : %p\n", &lambda4);
 lambda4();

 auto lambda5 = [&]{ printf("lambda5(&) : %p, %p, %p, %p\n", &a1, &a2, &a3, &a4); };
 printf("lambda5 : %p\n", &lambda5);
 lambda5();

 return 0;
}


실행 결과
a1 : 002BF9E8
a2 : 002BF9EC
a3 : 002BF9F8
a4 : 002BF9FC
lambda1 : 002BF9F0
lambda1(a1) : 002BF9F0
lambda2 : 002BF9F4
lambda2(&a1) : 002BF9E8
lambda3 : 002BFA00
lambda3(&a1, &a2) : 002BF9E8, 002BF9EC
lambda3_1 : 002BFA08
lambda3_1(a1, a2) : 002BFA08, 002BFA0C
lambda4 : 002BFA10
lambda4(=) : 002BFA10, 002BFA14, 002BFA18, 002BFA1C
lambda5 : 002BFA20
lambda5(&) : 002BF9E8, 002BF9EC, 002BF9F8, 002BF9FC

lambda 함수를 auto에 넣었고, auto 자체도 스택에 자리를 차지하고 있으며
auto의 크기는 캡쳐된 변수들의 크기만큼 커졌다.



코드

#include "stdafx.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
 int a1;
 int a2;
 int a3;
 int a4;

 printf("a1 : %p\n", &a1);
 printf("a2 : %p\n", &a2);
 printf("a3 : %p\n", &a3);
 printf("a4 : %p\n", &a4);

 [a1]{ printf("lamda1(a1) : %p\n", &a1); }();

 int temp1;
 printf("temp1 : %p\n", &temp1);

 [&a1]{ printf("lamda2(&a1) : %p\n", &a1); }();

 int temp2;
 printf("temp2 : %p\n", &temp2);

 [&a1, &a2]{ printf("lamda3(&a1, &a2) : %p, %p\n", &a1, &a2); }();

 int temp3;
 printf("temp3 : %p\n", &temp3);

 [a1, a2]{ printf("lamda3_1(a1, a2) : %p, %p\n", &a1, &a2); }();

 int temp4;
 printf("temp4 : %p\n", &temp4);

 [=]{ printf("lamda4(=) : %p, %p, %p, %p\n", &a1, &a2, &a3, &a4); }();

 int temp5;
 printf("temp5 : %p\n", &temp5);

 [&]{ printf("lamda5(&) : %p, %p, %p, %p\n", &a1, &a2, &a3, &a4); }();

 return 0;
}


실행 결과
a1 : 003CFC84
a2 : 003CFC80
a3 : 003CFC78
a4 : 003CFC7C
lamda1(a1) : 003CFC74
temp1 : 003CFC64
lamda2(&a1) : 003CFC84
temp2 : 003CFC60
lamda3(&a1, &a2) : 003CFC84, 003CFC80
temp3 : 003CFC5C
lamda3_1(a1, a2) : 003CFC70, 003CFC74
temp4 : 003CFC58
lamda4(=) : 003CFC68, 003CFC6C, 003CFC70, 003CFC74
temp5 : 003CFC54
lamda5(&) : 003CFC84, 003CFC80, 003CFC78, 003CFC7C

람다에서 캡쳐한 변수들의 크기만큼 메모리가 커졌다 작아졌다 한다.
그냥 일반 함수 처리할때와 동일한듯 하다.



코드

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <Windows.h>

int main(int argc, char* argv[])
{
 int a1;
 int a2;
 int a3;
 int a4;

 auto lambda1 = [a1]{ for(int i=0; i<10000; ++i); };
 auto lambda1_1 = [&a1]{ for(int i=0; i<10000; ++i); };
 auto lambda2 = [a1, a2]{ for(int i=0; i<10000; ++i); };
 auto lambda2_1 = [&a1, &a2]{ for(int i=0; i<10000; ++i); };
 auto lambda3 = [a1, a2, a3]{ for(int i=0; i<10000; ++i); };
 auto lambda3_1 = [&a1, &a2, &a3]{ for(int i=0; i<10000; ++i); };
 auto lambda4 = [=]{ for(int i=0; i<10000; ++i); };
 auto lambda4_1 = [&]{ for(int i=0; i<10000; ++i); };

 auto lambda5 = [=]{ int b=a1; b=a2; };
 auto lambda5_1 = [&]{ int b=a1; b=a2; };

 auto lambda6 = []{ int b; };
 auto lambda6_1 = []{ int a, b; };

 printf("sizeof(lambda1) : %d\n",  sizeof(lambda1   ));
 printf("sizeof(lambda1_1) : %d\n",  sizeof(lambda1_1 ));
 printf("sizeof(lambda2) : %d\n",  sizeof(lambda2  ));
 printf("sizeof(lambda2_1) : %d\n",  sizeof(lambda2_1 ));
 printf("sizeof(lambda3) : %d\n",  sizeof(lambda3  ));
 printf("sizeof(lambda3_1) : %d\n",  sizeof(lambda3_1 ));
 printf("sizeof(lambda4) : %d\n",  sizeof(lambda4  ));
 printf("sizeof(lambda4_1) : %d\n",  sizeof(lambda4_1 ));
 printf("sizeof(lambda5) : %d\n",  sizeof(lambda5  ));
 printf("sizeof(lambda5_1) : %d\n",  sizeof(lambda5_1 ));
 printf("sizeof(lambda6) : %d\n",  sizeof(lambda6  ));
 printf("sizeof(lambda6_1) : %d\n",  sizeof(lambda6_1 ));
 
 return 0;
}


실행결과
sizeof(lambda1) : 4
sizeof(lambda1_1) : 4
sizeof(lambda2) : 8
sizeof(lambda2_1) : 8
sizeof(lambda3) : 12
sizeof(lambda3_1) : 12
sizeof(lambda4) : 1
sizeof(lambda4_1) : 1
sizeof(lambda5) : 8
sizeof(lambda5_1) : 8
sizeof(lambda6) : 1
sizeof(lambda6_1) : 1

[&], [=]를 사용할 경우 내부에서 참조하는 개수만큼의 사이즈가 나온다.
[]로 하면 람다의 사이즈는 1이다.
참고
빈 클래스의 사이즈가 1이다.


'Develop' 카테고리의 다른 글

mysql 유일한값 뽑아내기  (0) 2012.11.08
lambda 호출시간?  (0) 2012.05.30
hg convert  (0) 2012.05.04
Boost::any  (0) 2012.04.13
컴파일러 버젼 Define  (0) 2012.01.13

+ Recent posts