2016-09-30 52 views
0

我有一些问题C++拉姆达的std ::函数的内存管理

  1. 哪里是C的内存位置++拉姆达的代码和捕获的变量?

  2. lambda的内存空闲时? (条件)

  3. “std :: function :: operator =()”复制代码或代码的指针?

  4. 是否有任何std :: function的深拷贝方法?

+0

你是什么意思*深拷贝*? –

+0

复制构造函数应该处理那个Iast。 – user4581301

回答

1

Lambda表达式只是创建临时功能对象(并定义其相应类)的便捷简写。该对象仅包含捕获的值作为其立即数据成员。在这方面,拉姆达达并没有真正将任何新的东西引入到语言中。

如果您明确声明该类并手动创建该临时功能对象,则该lambda对象的生命周期将相同。其“内存”位于任何其他临时存储器所在的位置。该语言确定了它的位置。这些对象按照相同的规则被销毁,所有其他临时对象被销毁,即它们在完整表达式结束时自动销毁(除了那些临时生命期延长的特殊情况)。

在C++中没有“复制代码”的概念。 std::function对象简单地使用一种实现特定的技术来存储它初始化的函子(功能对象,包括lambdas,常规函数指针,成员函数指针)以及某些未指定的类型擦除技术。没有必要为此复制代码。

对于std::function对象,“深度复制”的含义并不清楚。该类的接口规范不提供深度和浅度复制之间的任何区别。

+0

“深层复制”意思是“将代码复制到另一个存储位置”ps。我为我可怕的英语技能感到抱歉...... –

+0

@SoonwonMoon在C++中,“代码”是完全不可变的,它存在于特殊的“代码”存储中。由于它是不可变的,因此永远不需要复制代码:任何需要它的人都会使用相同的“副本”。 – AnT