【问题标题】:What exactly is "*const ()" in Rust?Rust 中的“*const ()”到底是什么?
【发布时间】:2021-04-13 14:36:09
【问题描述】:

那么,Rust 中的“*const ()”到底是什么?似乎我可以在 Rust 中将一些原始值(整数值、函数)“作为”这种类型,如下所示:

let foo = 1;
let pointer = foo as *const ();  // this works.

但是对于浮点数等等,编译器不允许我们做上面的强制,那么Rust中的“*const()”是什么?是否类似于 C/C++ 中的void*?如果是这样,为什么它不支持指向浮点数?

顺便说一句,添加当前在参考中使用此模式的情况:https://doc.rust-lang.org/std/mem/fn.transmute.html

fn foo() -> i32 {
    0
}
let pointer = foo as *const ();  // here it is!!!
let function = unsafe {
    std::mem::transmute::<*const (), fn() -> i32>(pointer)
};
assert_eq!(function(), 0);

【问题讨论】:

  • @eggyal 这不是我要找的。我的好奇心是关于“指向单位值的原始指针”,因为单位值在 Rust 中有点无用且微不足道,所以我想知道我们可以在什么样的场景中使用这种模式。
  • @eggyal 我明白了,为什么浮动不能这样有点奇怪。
  • 为什么?内存地址是整数。 3.141 as *const () 代表什么内存地址?
  • @eggyal,你是对的,对不起,与参考演员混淆。这里我们使用的是值本身。

标签: rust


【解决方案1】:

*const () 实际上与 C 的 const* void 非常相似,除了 () 只代表一个值,而 void 代表没有值。 Relevant answer about difference between () and void

如果是,为什么不支持指向浮点数?

确实如此,只是foo as *const () 与指向浮点数无关,它与取值并将其转换为具有相同数值的指针有关,这对浮点数没有意义.

【讨论】:

  • 我认为这有点误导,因为(const) void* 不是真的指向void 的指针;这是very special case。所以void()之间的区别并不能告诉你const void**const ()之间的区别。
【解决方案2】:

该示例仅使用*const () 作为任意非函数指针类型,正如它所说:

指针变成函数指针。

*const i32 或其他类型完全相同,但作者需要选择一个,() 是最简单的。

和C/C++中的void*类似吗?

不是真的。它是一个指向() 的指针,它是一个完全普通的类型(如果大小为零),并且没有特殊规则like void* does。另请参阅

A Rust curiosity: pointers to zero-sized types

Final conclusion: arithmetic on a void* is illegal in both C and C++(在 *const () 上使用 .offset 的算术非常好)。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2013-05-29
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多