gpt4 book ai didi

rust - Rust 中类似指针的常量内存类型

转载 作者:行者123 更新时间:2023-11-29 08:31:15 27 4
gpt4 key购买 nike

我正在用 Rust 编写一个简单的网络协议(protocol)实现作为练习。它将从套接字读取协议(protocol)数据单元到内存,并继续将其组件解析为具有适当字段的 Rust struct

可用于解析的内存块的最佳类型是什么?我应该能够调用单独的函数来解析不同偏移量的部分内容。在 C 中,我会使用简单的 const char *。看起来 Rust 中的原始指针是可能的,但不提供任何额外的安全优势,因为对它们的大多数操作都是不安全的,并且没有边界检查。

另一方面,我想将 PDU block 作为一个连续的内存块保留在堆上,与从套接字中读取的完全一样。换句话说,我没有任何表示开销。

最佳答案

如果你想要一个堆分配的不可变字节缓冲区 Vec<u8> 是显而易见的选择。

从你问题的语气来看,我怀疑你可能认为 Vec 的开销太大 - 不是这样:

  • 它只包含指向分配的堆内存和大小的指针。如果你想要一个安全的地方来存储你的协议(protocol)消息,那是你可以逃脱的最低限度,真的,

  • 本着 rust 的理念:您只需为您使用的功能付费。

  • 因为它是一个基本构建 block ,std 库设计者对其设计做出了很多保证,使其能够以非常低的开销方式使用。我建议阅读上面链接的 std 库文档——其中有一节是关于这些保证的。

Can I make it read-only?

是的,除非您声明它们,否则 rust 中的所有变量都是不可变的 mut .您甚至可以从可变变量开始(如果您打算首先填充缓冲区,则这是必需的),然后重新绑定(bind)到一个不可变变量。

Also how efficient is index access? For example, doing repeatedly vec[n] version calculating vec+n in C once and using it repeatedly.

在为此担心之前,我建议您以最清晰、最合乎逻辑的方式编写代码。编译器将进行优化,这很可能使这些问题变得毫无意义。如果在分析之后,您遇到性能问题,那么请确保您可以进行一些调整。

如果你想多次访问一个元素,你可以引用它:

let el = &buf[n];

然后使用 *el引用元素。

如果您想按顺序在缓冲区中移动,请使用迭代器,而不是按顺序索引字节。迭代器在内部使用指针实现。

如果你想传递缓冲区的一部分,而不复制,那么取一个切片:

let s1 = &buf[10..12];
// s1 now contains a slice of bytes 10 through 12

同样,切片的开销很低:一个指向开始的指针和一个长度。

以上都是安全代码。还有一些不安全的函数(例如 get_unchecked 可以在没有边界检查的情况下访问元素)。您甚至可以使用 as_ptr() 获得原始指针如果你真的需要它。

关于rust - Rust 中类似指针的常量内存类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57100454/

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