主要观点:一年前观察到原位构造简单,半年前创建了“放置函数”的放置箱(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++保证复制省略的相似性和可组合性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。