我有一些问题C++拉姆达的std ::函数的内存管理
哪里是C的内存位置++拉姆达的代码和捕获的变量?
lambda的内存空闲时? (条件)
“std :: function :: operator =()”复制代码或代码的指针?
是否有任何std :: function的深拷贝方法?
我有一些问题C++拉姆达的std ::函数的内存管理
哪里是C的内存位置++拉姆达的代码和捕获的变量?
lambda的内存空闲时? (条件)
“std :: function :: operator =()”复制代码或代码的指针?
是否有任何std :: function的深拷贝方法?
Lambda表达式只是创建临时功能对象(并定义其相应类)的便捷简写。该对象仅包含捕获的值作为其立即数据成员。在这方面,拉姆达达并没有真正将任何新的东西引入到语言中。
如果您明确声明该类并手动创建该临时功能对象,则该lambda对象的生命周期将相同。其“内存”位于任何其他临时存储器所在的位置。该语言确定了它的位置。这些对象按照相同的规则被销毁,所有其他临时对象被销毁,即它们在完整表达式结束时自动销毁(除了那些临时生命期延长的特殊情况)。
在C++中没有“复制代码”的概念。 std::function
对象简单地使用一种实现特定的技术来存储它初始化的函子(功能对象,包括lambdas,常规函数指针,成员函数指针)以及某些未指定的类型擦除技术。没有必要为此复制代码。
对于std::function
对象,“深度复制”的含义并不清楚。该类的接口规范不提供深度和浅度复制之间的任何区别。
“深层复制”意思是“将代码复制到另一个存储位置”ps。我为我可怕的英语技能感到抱歉...... –
@SoonwonMoon在C++中,“代码”是完全不可变的,它存在于特殊的“代码”存储中。由于它是不可变的,因此永远不需要复制代码:任何需要它的人都会使用相同的“副本”。 – AnT
你是什么意思*深拷贝*? –
复制构造函数应该处理那个Iast。 – user4581301