gpt4 book ai didi

rust - #[inline] 可以同时用于 trait 方法声明和实现吗?

转载 作者:行者123 更新时间:2023-11-29 08:07:52 26 4
gpt4 key购买 nike

我有一些小方法的特点,这些小方法通常作为实现结构具有的其他方法的单行包装器实现。如果我想确保特征方法是内联的,我应该将 #[inline(always)] 放在特征定义内,还是放在每个结构的 impl 内?我更愿意将它简单地放在特征定义中,但据我所知这是行不通的。

最佳答案

inline 是什么意思?

当编译器内联一个调用时,它会在调用点复制函数体。从本质上讲,就好像代码已被复制/粘贴到每个内联的调用站点。

#[inline(always)] 是什么意思?

这指示编译器始终执行内联。

通常,编译器在以下情况下执行内联:

  • 函数体已知
  • 一组启发式估计这是一个很好的权衡(虽然它可能不是),这主要取决于函数体的大小

为什么我不能在特征方法上指定#[inline(always)]

因为没有body。

我知道这听起来可能很老套,但这是事实。

在 Rust 中,traits 可以通过两种方式使用:

  • 作为边界,用于通用参数
  • 作为运行时接口(interface),又名特征对象

当用作特征对象时,实际上没有主体:要调用的函数在运行时确定!

现在,有一些特定的优化(去虚拟化),编译器会尝试预测或跟踪变量的实际动态类型,以避免动态分派(dispatch)。我什至在 GCC 中看到了部分去虚拟化,其中编译器计算每种类型的可能性并为足够可能的类型创建一个 if 阶梯(if A { A::call(x); } else if B { B::call(x); } else { x.call(); }).然而,当然,这些并不能保证成功。

那么,#[inline(always)] 在虚拟调用中的语义是什么?编译器是否应该默默地忽略该属性(呃!)?


在我看来,您正在寻找的是一个新属性 (require(inline(always))?) 以对特征方法的实现实现特定约束。

据我所知,这还不存在。

关于rust - #[inline] 可以同时用于 trait 方法声明和实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41733424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com