Hasty Briefsbeta

双语

The Cost of a Closure in C

5 months ago
  • #C++
  • #closures
  • #performance
  • 闭包是包含数据和指令的编程结构,与其输入参数或返回值没有直接关联。
  • 闭包泛化了函数的概念,使其能够处理未直接传递的实例数据,例如来自外围作用域的变量。
  • 除非面向栈或字节码等低级编程环境,否则大多数现代语言都支持闭包。
  • 本文重点讨论C和C++中的闭包,旨在为ISO C标准化一种解决方案。
  • C语言中常见的问题是向`qsort`等函数传递额外数据,通常通过静态变量解决,但这存在线程安全和共享状态等局限性。
  • C/C++中的四种主要解决方案包括:使用用户数据指针重新实现函数、GNU嵌套函数、Apple Blocks以及C++ Lambda表达式。
  • 性能基准测试显示,C++ Lambda(非类型擦除)速度最快,而GNU嵌套函数和Rosetta Code风格的Lambda由于优化障碍表现不佳。
  • Apple Blocks性能中等,但受ARC开销和复制行为拖累。
  • 文章建议,采用轻量级类型擦除层(如`std::function_ref`)可在C闭包的易用性和性能间取得平衡。
  • 现有扩展如GNU嵌套函数和Apple Blocks存在实现缺陷,若不改进则不适合直接纳入ISO C标准。