C++ C++;lambda在运行时的实现
在Objective-C中,我们知道块在运行时有3个实现C++ C++;lambda在运行时的实现,c++,objective-c,lambda,objective-c-blocks,objective-c++,C++,Objective C,Lambda,Objective C Blocks,Objective C++,在Objective-C中,我们知道块在运行时有3个实现 NSGlobalBlock-这是运行时的单例,它是在不使用堆栈变量值的情况下创建的 NSStackBlock-这不是单例,它是在堆栈上分配的(不是在堆上),它是在我们使用一些堆栈变量时创建的 NSMallocBlock-在堆上分配,当我们想将块存储为ivar或某个类的属性,或堆中的任何位置时使用,即@property(非原子,复制)MyBlockType myBlock或当我们使用Block\u copy()函数时。这一点非常重要,因为N
NSGlobalBlock
-这是运行时的单例,它是在不使用堆栈变量值的情况下创建的NSStackBlock
-这不是单例,它是在堆栈上分配的(不是在堆上),它是在我们使用一些堆栈变量时创建的NSMallocBlock
-在堆上分配,当我们想将块存储为ivar或某个类的属性,或堆中的任何位置时使用,即@property(非原子,复制)MyBlockType myBlock代码>或当我们使用Block\u copy()
函数时。这一点非常重要,因为NSMallocBlock保留了上下文中的对象,如果我们不正确使用块,这一事实可能会创建一些拥有周期
我的问题是:“在哪里可以找到完整的解释C++ LAMBDAS运行时,以及编译器是如何处理的?或者,你能解释一下吗?使用C++ LAMBDAS进行内存管理有什么特殊问题吗?在那里分配了lambda,堆或栈上的?” lambdas实现是编译器特定的。< /P> 该标准没有指定内存分配的位置,但根据经验,它们大致相当于,它们及其捕获的值与任何普通对象一样复制到堆栈上 例如
“它是在我们不使用_块修饰符更改堆栈变量值的情况下创建的。”否。
NSGlobalBlock
用于非闭包的块,即不从外部范围捕获任何局部变量的块。“它是在我们对某些堆栈变量使用_块修饰符时创建的。”不。同样,它适用于任何闭包块,即使用外部范围的局部变量的块。它不需要一个\u块
变量。@newact你说得对,NSGlobalBlock可以使用静态变量,谢谢!
std::vector<int> v{10,11,12,13};
std::for_each(v.begin(), v.end(), [](int& i) {i++;});
std::vector<int> v{10,11,12,13};
int C = 10;
int D = 20;
std::for_each(v.begin(), v.end(), [C,&D](int& i) {i += C + D;});
void g(const std::function& f);
// ...
auto f = [=](int& i){i += C;}; // still on the stack (compiler-specific type)
g(f); // std::function constructed, possibly on the heap