Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;lambda在运行时的实现_C++_Objective C_Lambda_Objective C Blocks_Objective C++ - Fatal编程技术网

C++ C++;lambda在运行时的实现

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

在Objective-C中,我们知道块在运行时有3个实现


  • 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