VS2010中不同大小的lambda表达式?

时间:2011-02-23 18:35:21

标签: c++ visual-studio-2010 lambda

出于好奇,我测试了lamba表达式的大小。我的第一个想法是,它们是4字节大,就像一个函数指针。奇怪的是,我的第一次测试的结果是1

auto my_lambda = [&]() -> void {};
std::cout << sizeof(my_lambda) << std::endl;

然后我在lambda中测试了一些计算,输出仍然是1

auto my_lambda2 = [&]() -> void {int i=5, j=23; std::cout << i*j << std::endl;};
std::cout << sizeof(my_lambda2) << std::endl;

我的下一个想法有点随意,但输出最终改变了,显示了等待的4

auto my_lambda3 = [&]() -> void {std::cout << sizeof(my_lambda2) << std::endl;};
std::cout << sizeof(my_lambda3) << std::endl;

至少在Visual Studio 2010中。Ideone still display 1 as the output.
我知道标准规则,lambda表达式不能出现在未评估的上下文中,但afaik只计算直接lambda使用,如
sizeof([&]() -> void {std::cout << "Forbidden." << std::endl;})
在哪个VS2010上提示我编译错误。 有人知道发生了什么事吗?

2 个答案:

答案 0 :(得分:2)

感谢@Hans Passant对该问题的评论,找到了解决方案。我原来的做法是错误的,因为我认为每个对象都会被lambda捕获,但事实并非如此,只有封闭范围内的那些对象才会被使用。 对于那些捕获对象的每个人,使用4个字节(参考的大小)。

答案 1 :(得分:1)

Visual Studio可能不会将lambda对象实现为函数。你可能得到了一个对象。谁知道它的样子。如果您真的感兴趣,可以随时使用调试器查看变量并查看它们的外观......如果它能让您满意的话。