 Rust在Substrate 开发框架中的使用● 数据存储、索引 Chain-less Vs blockchain 协议: ● Bitcoin ● Ethereum ● Polkadot 特点: ● 区块结构,链式存储 ● 激励机制 ● 数据交易 特点: ● Gas 费用 ● 沙盒环境 ● 链上存储租赁 ● 状态回滚 Smart contract smart contract 特点: ● Gas 费用 ● 沙盒环境 状态回滚 Smart contract Vs application chain app chain特点: ● Runtime 安全有开发者完全负责 ● 获取链上所有状态 ● 高度定制化,包括共识,通证,交易 方式 一个开源、模块化、可扩展的区块链开 发框架,涵盖了区块链的核心组件: ● Database layer ● P2P ● PoS ● Transaction pool ● 编译为Wasm Wasm在链上存储 Rust 编译成本地可执行文件 RUNTIME Substrate Runtime Module Library 提供一系列的即插即用的功能,如 资产管理、共识、合约、自治等。 你也可以开发自己的Runtime组 件。 Substrate Runtime 组件 Substrate Runtime Module Library (SRML) assets0 码力 | 37 页 | 967.22 KB | 1 年前3 Rust在Substrate 开发框架中的使用● 数据存储、索引 Chain-less Vs blockchain 协议: ● Bitcoin ● Ethereum ● Polkadot 特点: ● 区块结构,链式存储 ● 激励机制 ● 数据交易 特点: ● Gas 费用 ● 沙盒环境 ● 链上存储租赁 ● 状态回滚 Smart contract smart contract 特点: ● Gas 费用 ● 沙盒环境 状态回滚 Smart contract Vs application chain app chain特点: ● Runtime 安全有开发者完全负责 ● 获取链上所有状态 ● 高度定制化,包括共识,通证,交易 方式 一个开源、模块化、可扩展的区块链开 发框架,涵盖了区块链的核心组件: ● Database layer ● P2P ● PoS ● Transaction pool ● 编译为Wasm Wasm在链上存储 Rust 编译成本地可执行文件 RUNTIME Substrate Runtime Module Library 提供一系列的即插即用的功能,如 资产管理、共识、合约、自治等。 你也可以开发自己的Runtime组 件。 Substrate Runtime 组件 Substrate Runtime Module Library (SRML) assets0 码力 | 37 页 | 967.22 KB | 1 年前3
 运⾏在浏览器中的 P2P ⽹络 - 李敏成for Geeks Validator MessageCallback Native Backend WASM Backend (WIP) Future Inside 运⾏时抽象 节点共识机制 ⼤规模节点集成测试 Outside 跨平台的 WASM Backend Backend 开发⽂档 Contact Us Twitter: @ringsnetworkio Email:0 码力 | 23 页 | 1.74 MB | 1 年前3 运⾏在浏览器中的 P2P ⽹络 - 李敏成for Geeks Validator MessageCallback Native Backend WASM Backend (WIP) Future Inside 运⾏时抽象 节点共识机制 ⼤规模节点集成测试 Outside 跨平台的 WASM Backend Backend 开发⽂档 Contact Us Twitter: @ringsnetworkio Email:0 码力 | 23 页 | 1.74 MB | 1 年前3
 Rust分布式账务系统 - 胡宇Sourcing ● 针对读场景,写场 景分别优化 ● 稳定的底层 API ● 灵活的顶层 API ● 树状结构 ● 聚合查询 ● 正确性:内存安全,线程安全 ● 可靠性: Raft 共识算法 raft-rs ● 高性能:关键路径无锁单线程 顶层架构 ● Gateway 路由层 ○ 业务 API 到底层 API 的翻 译 ○ 产生转账计划 ● Marker 事务层 Raft 共识,等待 events 被多数节点保存 ○ 共识:基于 raft-rs 的可靠消息队 列 ○ 存储: Rocksdb with Rust 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events ,更新状态机 (账户表) ● 4. 回调完成请求 账户层: Auticuro 分布式账务系统 1 2 3 4 事务层: Marker0 码力 | 27 页 | 12.60 MB | 1 年前3 Rust分布式账务系统 - 胡宇Sourcing ● 针对读场景,写场 景分别优化 ● 稳定的底层 API ● 灵活的顶层 API ● 树状结构 ● 聚合查询 ● 正确性:内存安全,线程安全 ● 可靠性: Raft 共识算法 raft-rs ● 高性能:关键路径无锁单线程 顶层架构 ● Gateway 路由层 ○ 业务 API 到底层 API 的翻 译 ○ 产生转账计划 ● Marker 事务层 Raft 共识,等待 events 被多数节点保存 ○ 共识:基于 raft-rs 的可靠消息队 列 ○ 存储: Rocksdb with Rust 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events ,更新状态机 (账户表) ● 4. 回调完成请求 账户层: Auticuro 分布式账务系统 1 2 3 4 事务层: Marker0 码力 | 27 页 | 12.60 MB | 1 年前3
 在Solana合约链实现IBC协议跨链互操作 - 苏胤榕后通过合约随机选取部分签名人,只要这一部分签名人的1/3即可。这种方法 保证了随机公平性(这里的公平性需要更好的随机算法实现)。创新的核心就 是通过随机选择签名人。进而这个方案可以快速的推广到更多不同共识算法的 Rust合约链(Substrate chain, Near, Solana, Oasis, Nerovs 等等)实现。 总结,以及对未来IBC生态的展望 总结和展望 > 提供代 基于IBC协议的全链应用(类似WeChat 或许会出 现) 3. 更加高效的支持跨链互操作,随着协议的不断发展 与进化。 4. 更多的区块链平台的支持。(例如这里的这套方案, 可以将任何链的共识看作 是ICS06类似的共识处理, 支持更多的Rust合约链集成IBC协议) 有关IBC协议的相关资料 相关资料 > 有关与IBC协议相关的资料 - IBC协议的Sepc文档 - IBC协议的Rust语言实现0 码力 | 29 页 | 3.05 MB | 1 年前3 在Solana合约链实现IBC协议跨链互操作 - 苏胤榕后通过合约随机选取部分签名人,只要这一部分签名人的1/3即可。这种方法 保证了随机公平性(这里的公平性需要更好的随机算法实现)。创新的核心就 是通过随机选择签名人。进而这个方案可以快速的推广到更多不同共识算法的 Rust合约链(Substrate chain, Near, Solana, Oasis, Nerovs 等等)实现。 总结,以及对未来IBC生态的展望 总结和展望 > 提供代 基于IBC协议的全链应用(类似WeChat 或许会出 现) 3. 更加高效的支持跨链互操作,随着协议的不断发展 与进化。 4. 更多的区块链平台的支持。(例如这里的这套方案, 可以将任何链的共识看作 是ICS06类似的共识处理, 支持更多的Rust合约链集成IBC协议) 有关IBC协议的相关资料 相关资料 > 有关与IBC协议相关的资料 - IBC协议的Sepc文档 - IBC协议的Rust语言实现0 码力 | 29 页 | 3.05 MB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。 Cargo.lock 文件确保可重现构建 Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建 产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问 49/562Rust 程序设计语言 简体中文版 并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如 何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。 50/562Rust 程序设计语言 简体中文版 函数 函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 67/562Rust 程序设计语言 简体中文版 什么是所有权? 所有权(ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使 用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的 内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过 所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规0 码力 | 562 页 | 3.23 MB | 26 天前3 Rust 程序设计语言 简体中文版 1.85.0Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。 Cargo.lock 文件确保可重现构建 Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建 产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问 49/562Rust 程序设计语言 简体中文版 并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如 何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。 50/562Rust 程序设计语言 简体中文版 函数 函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 67/562Rust 程序设计语言 简体中文版 什么是所有权? 所有权(ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使 用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的 内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过 所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规0 码力 | 562 页 | 3.23 MB | 26 天前3
 Rust 语言学习笔记. 102 7.5.1 控制访问顺序--等待与通知 ................................................... 103 7.5.2 控制访问顺序的机制-原子类型与锁 ........................................ 104 7.6 并行 ..................................... Java 有相当大的差异。而跟 Ocaml, Haskell 这类函数式语言更加接近。 Rust 做到了内存安全而无需 .NET 和 Java 编程语言中实现自动垃圾收集器的 开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。 Rust 程序设计语言的本质在于赋能(empowerment):无论你现在编写的是何 种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。 比 语言一样,在局部变量离开作用域后,变量随即会被销毁;但不同是, Rust 会连同变量绑定的内存,不管是否为常量字符串,连同所有者变量一起被 销毁释放。 3.1.3 移动语义 在 Rust 中,和“绑定”概念相辅相成的另一个机制就是“转移 move 所有 权”,意思是,可以把资源的所有权(ownership)从一个绑定转移(move)成另 一个绑定,这个操作同样通过 let 关键字完成,和绑定不同的是,=两边的左值 和右值均为两个标识符:0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记. 102 7.5.1 控制访问顺序--等待与通知 ................................................... 103 7.5.2 控制访问顺序的机制-原子类型与锁 ........................................ 104 7.6 并行 ..................................... Java 有相当大的差异。而跟 Ocaml, Haskell 这类函数式语言更加接近。 Rust 做到了内存安全而无需 .NET 和 Java 编程语言中实现自动垃圾收集器的 开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。 Rust 程序设计语言的本质在于赋能(empowerment):无论你现在编写的是何 种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。 比 语言一样,在局部变量离开作用域后,变量随即会被销毁;但不同是, Rust 会连同变量绑定的内存,不管是否为常量字符串,连同所有者变量一起被 销毁释放。 3.1.3 移动语义 在 Rust 中,和“绑定”概念相辅相成的另一个机制就是“转移 move 所有 权”,意思是,可以把资源的所有权(ownership)从一个绑定转移(move)成另 一个绑定,这个操作同样通过 let 关键字完成,和绑定不同的是,=两边的左值 和右值均为两个标识符:0 码力 | 117 页 | 2.24 MB | 1 年前3
 简谈 Rust 与国密 TLS - 王江桐且废弃此版本,对于密码算法进行了更新,使用更安全的密码算法; • RFC 8998:基于 RFC 8446,扩展通用 TLS 1.3,增加国密套件支持,声明 SM4_GCM_SM3 、 SM4_CCM_SM3 以及 SM2 单证书机制在 TLS 1.3 中的使用; • 当前 360 安全浏览器、奇安信可信浏览器等产品已支持 TLCP 协议,部分银行或金融产品仅允许通过 TLCP 协议进行 通信。 国密算法在 TLS 安全协议中的应用 Resumption机制 • SM4GCMSM3 • Sm2国密双证书 • Sm2 GMT ECDHE • Sm2ECC • 国际通用密码套 • 单证书机制 • Resumption + Ticket机制 • SM4GCMSM3 • Sm2国密单/双证书 • Sm2 IEEE ECDHE • Sm2ECC 1 2 3 • 国际通用密码套 • 单证书机制 • Resumption Resumption + Ticket机制 • SM4GCMSM3 • Sm2国密单证书 • Sm2 IEEE ECDHE ylong_tls 支持版本以及特性 提供C-API接口方便C语言使用 ylong_tls Rust Adapt C-API (.h + so\.a) C APP Rust APP Rust纯软件实现 指令加速(X86、ARM) no_std版本 可兼容Openssl的0 码力 | 44 页 | 3.70 MB | 1 年前3 简谈 Rust 与国密 TLS - 王江桐且废弃此版本,对于密码算法进行了更新,使用更安全的密码算法; • RFC 8998:基于 RFC 8446,扩展通用 TLS 1.3,增加国密套件支持,声明 SM4_GCM_SM3 、 SM4_CCM_SM3 以及 SM2 单证书机制在 TLS 1.3 中的使用; • 当前 360 安全浏览器、奇安信可信浏览器等产品已支持 TLCP 协议,部分银行或金融产品仅允许通过 TLCP 协议进行 通信。 国密算法在 TLS 安全协议中的应用 Resumption机制 • SM4GCMSM3 • Sm2国密双证书 • Sm2 GMT ECDHE • Sm2ECC • 国际通用密码套 • 单证书机制 • Resumption + Ticket机制 • SM4GCMSM3 • Sm2国密单/双证书 • Sm2 IEEE ECDHE • Sm2ECC 1 2 3 • 国际通用密码套 • 单证书机制 • Resumption Resumption + Ticket机制 • SM4GCMSM3 • Sm2国密单证书 • Sm2 IEEE ECDHE ylong_tls 支持版本以及特性 提供C-API接口方便C语言使用 ylong_tls Rust Adapt C-API (.h + so\.a) C APP Rust APP Rust纯软件实现 指令加速(X86、ARM) no_std版本 可兼容Openssl的0 码力 | 44 页 | 3.70 MB | 1 年前3
 WebAssembly 简介 - 陈思衡image / chart Wasm 的 memory 是 host 内存中的一部分。 对于 Wasm 而言,这块内存是从 0 开始的,而不是 host 所看到的地址。 WebAssembly 机制 memory Wasm 编写的 function 可以通过 “export” 导出给 host 调用。 Host 可以把自己的 function 通过 “import“ 提供给 wasm 调用。 WASM 使用场景和问题 利用语言本身 Async 机制 因为 Rust 的 async 机制是无栈协程,会将 async 部分在编译时隐式转换成一个 Future。 所以我们可以利用这一点来实现一个 Async 的 Wasm。 Async Wasm 解决方案 Photo / image / chart 利用本身 Async 机制 自行实现 Async Runtime Async wasm 中把 future 存入固定内存处。 • 导出 poll 函数给 host 调用。 • 把 host function 包装成自定义 Future。 • 实现简单 利用本身 Async 机制 优点 • 方案不通用(wasm 局限于某一种语言) • 无法与现有生态配合 缺点 Async 的 Wasm 基于 fiber / ucontext Async Wasm 解决方案0 码力 | 24 页 | 773.46 KB | 1 年前3 WebAssembly 简介 - 陈思衡image / chart Wasm 的 memory 是 host 内存中的一部分。 对于 Wasm 而言,这块内存是从 0 开始的,而不是 host 所看到的地址。 WebAssembly 机制 memory Wasm 编写的 function 可以通过 “export” 导出给 host 调用。 Host 可以把自己的 function 通过 “import“ 提供给 wasm 调用。 WASM 使用场景和问题 利用语言本身 Async 机制 因为 Rust 的 async 机制是无栈协程,会将 async 部分在编译时隐式转换成一个 Future。 所以我们可以利用这一点来实现一个 Async 的 Wasm。 Async Wasm 解决方案 Photo / image / chart 利用本身 Async 机制 自行实现 Async Runtime Async wasm 中把 future 存入固定内存处。 • 导出 poll 函数给 host 调用。 • 把 host function 包装成自定义 Future。 • 实现简单 利用本身 Async 机制 优点 • 方案不通用(wasm 局限于某一种语言) • 无法与现有生态配合 缺点 Async 的 Wasm 基于 fiber / ucontext Async Wasm 解决方案0 码力 | 24 页 | 773.46 KB | 1 年前3
 Hello 算法 1.2.0 简体中文 Rust 版如果感觉以下内容理解困难,可以在读完“栈”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 。有了这些地址,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数 据结构与算法的设计中,内存资源是一个重要的考虑 选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据 此变量,我们可以定位列表尾部,以及判断是否需要扩容。 ‧ 扩容机制:若插入元素时列表容量已满,则需要进行扩容。先根据扩容倍数创建一个更大的数组,再将 当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 // === File:0 码力 | 387 页 | 18.51 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Rust 版如果感觉以下内容理解困难,可以在读完“栈”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 。有了这些地址,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数 据结构与算法的设计中,内存资源是一个重要的考虑 选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据 此变量,我们可以定位列表尾部,以及判断是否需要扩容。 ‧ 扩容机制:若插入元素时列表容量已满,则需要进行扩容。先根据扩容倍数创建一个更大的数组,再将 当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 // === File:0 码力 | 387 页 | 18.51 MB | 10 月前3
 Hello 算法 1.0.0 Rust版如果感觉以下内容理解困难,可以在读完“栈”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 编号,确保每个内存空间都有唯一的内存地址。有了这些地址,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 � 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉 及地址空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素 选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据 此变量,我们可以定位列表尾部,以及判断是否需要扩容。 ‧ 扩容机制:若插入元素时列表容量已满,则需要进行扩容。先根据扩容倍数创建一个更大的数组,再将 当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 // === File:0 码力 | 383 页 | 17.61 MB | 1 年前3 Hello 算法 1.0.0 Rust版如果感觉以下内容理解困难,可以在读完“栈”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 编号,确保每个内存空间都有唯一的内存地址。有了这些地址,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 � 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉 及地址空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素 选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据 此变量,我们可以定位列表尾部,以及判断是否需要扩容。 ‧ 扩容机制:若插入元素时列表容量已满,则需要进行扩容。先根据扩容倍数创建一个更大的数组,再将 当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 // === File:0 码力 | 383 页 | 17.61 MB | 1 年前3
共 21 条
- 1
- 2
- 3













