放置函数

主要观点:一年前观察到原位构造简单,半年前创建了“放置函数”的放置箱(placing crate),放置函数可在调用者栈帧中构造返回类型,而非函数栈帧,地址稳定,可改善性能并支持dyn AFITs 等。通过 proc 宏实现了原型,其 desugaring 过程复杂,需处理类型信息、添加Drop实现等。放置函数受超级 let(Rust 夜间版)和保证复制省略(C++17)启发,设计需平衡控制、集成和兼容性三方面约束,应将其建模为一种效果。Rust 已在某些情况下保证了放置,如 SYSV ABI 下的特定代码。还讨论了放置参数、借用/局部生命周期扩展、固定、注解必要性、自引用类型、嵌套放置函数等问题,放置函数可用于避免复制、实现生命周期扩展等,且设计应优先考虑向后兼容性,放置箱已实现放置函数的原型,完整方案应解决三种放置情况,同时考虑函数内和函数间的变体。

关键信息

  • 放置箱(placing crate)是基于 proc-macro 的“放置函数”原型。
  • 放置函数返回类型在调用者栈帧构造,地址稳定。
  • 受超级 let 和保证复制省略启发,设计需平衡多方面约束。
  • Rust 在 SYSV ABI 下某些代码已保证放置。
  • 讨论了多种与放置相关的问题及解决方案。

重要细节

  • 基本示例中Cat结构体的new函数使用#[placing]标记为放置函数,在调用者帧中构造Self
  • proc 宏实现放置函数时需处理类型信息,添加Drop实现等。
  • 超级 let 可在封闭作用域创建变量,放置函数可跨函数边界操作。
  • Rust 已保证的放置情况及与 C++保证复制省略的相似之处。
  • 放置参数需在参数/返回类型级别添加注解,以保持 API 向后兼容。
  • 借用/局部生命周期扩展可通过'super生命周期实现。
  • 注解对于逐步引入放置功能很重要,可避免修改大量现有代码。
  • 自引用类型需放置函数、自生命周期和部分构造函数配合。
  • 放置函数可嵌套,保持与 C++保证复制省略的相似性和可组合性。
阅读 29
0 条评论