【问题标题】:Why is passing `self` as a raw pointer not allowed?为什么不允许将“self”作为原始指针传递?
【发布时间】:2016-12-03 01:24:48
【问题描述】:

当我们想使用方法语法并禁用智能指针优化时会很好。

fn foo(*const self) // this would not let smart pointer optimizations

【问题讨论】:

  • 并禁用智能指针优化——您认为&self&mut self 执行哪些“优化”?此外,&self&mut self 不是“智能指针”。我可以看到 Box<Self> 被称为智能指针 but not many people know you can use that as self
  • 据我所知,引用会生成 noalias 标志,并且该标志会导致一些优化。
  • 只有 &mut 引用会生成 noalias (并且由于 llvm 错误,即使它已被关闭,直到另行通知)。能否请您分享您的用例(一个代码示例说明为什么 &self 不起作用)
  • 只有 &T 引用生成 noalias atm。我在 www.reddit.com/r/rust 上问了一个问题,如果 &mut T 将来会生成 noalias。他们说,在一些 llvm 错误得到修复后,它也会生成 noalias。我想写一些不安全的方法,因为它不安全,我想像 UnsafeCell 语义一样关闭引用优化(noalias,nocapture)。

标签: rust


【解决方案1】:

因为没有人要求它,这可能意味着没有人很关心它。

请注意,由于 Rust 的不安全语义尚未最终确定,因此打赌别名可能不是一个好主意。

【讨论】:

    【解决方案2】:

    我曾经这样做过,例如*const T

    
    /// Consider that Self is a struct composed of f64 fields, like a vector
    
    pub fn foo(&self) {
        let self_ptr = self as *const Self as *const f64;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 2021-01-19
      • 2011-08-20
      • 2015-05-26
      • 2016-09-14
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多