![Sway 如何用 [inline(always)] 与 [inline(never)] 控制函数内联?](http://pic.xiahunao.cn/yaotu/Sway 如何用 [inline(always)] 与 [inline(never)] 控制函数内联?)
Sway 如何用 #[inline(always)] 与 #[inline(never)] 控制函数内联【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway在 Sway 智能合同中调用一个函数时编译器有两种代码生成方式生成在函数定义处调用该函数的代码或者把函数代码拷贝内联到调用点。Sway 编译器会基于内部启发式自动决定内联#[inline(always)]与#[inline(never)]这两个属性就是用来向编译器表达倾向的。这篇文章给出属性的写法、可标注的范围、编译验证方式和性能边界让读者在一个 forc 可构建的 Sway 项目里完成给函数标注内联建议 → 编译验证这一操作。两个属性分别建议什么根据 attributes 参考 和 inline 参考页调用发生时编译器的两种选择对应两个关键词#[inline(never)]建议不做内联展开即生成到函数定义处调用的代码。参考页将其称为 Generate code。#[inline(always)]建议总是做内联展开即把函数代码拷贝到调用方避免额外的调用代码生成。参考页将其称为 Copy code。两种写法的官方示例// 建议生成调用代码不做内联展开 #[inline(never)] fn foo() {}// 建议把函数代码拷贝到调用方 #[inline(always)] fn bar() {}必须记住的前提#[inline(..)]在任何形式下都只是一个提示对编译器不构成要求。编译器仍会基于内部启发式自动内联函数参考页原文是 may be used to suggest, but not require。属性可以标注在哪里属性标注的限制条件来自编译器属性校验实现 attribute.rs以及其中的诊断信息只能标注函数inline属性只接受函数作为标注对象标注到其他条目上会报错错误信息为inline attribute can only annotate functions.同一函数只能标注一次校验逻辑中 inline 属性的重数是 exactly 1对同一项重复标注不被接受。参数只允许always或never属性参数被限定在这两个值之内其他写法不被接受。trait / ABI 接口面的函数不能标注源码中对 trait 与 ABI 接口面的函数项将 inline 属性判定为不可用Functions in the trait or ABI interface surface cannot be marked as inlined也就是说你只能对具体实现里的函数标注而不能在abi或 trait 的接口声明上标注。编译验证在函数上加好属性后用 forc 构建命令验证forc build该命令在 forc build 文档 所在的 forc 命令文档中定义用于构建当前工作区或单个包。验证方式如下成功构建通过说明属性语法与标注位置合法。需要明确的是属性是编译期提示文档没有提供直接观测该函数是否真的被内联的命令或输出构建通过只证明属性被接受不证明内联结果。失败如果属性标在函数以外的条目上构建会失败并给出上述inline attribute can only annotate functions.诊断据此可以定位到标注位置写错的地方。性能边界为什么建议内联需要谨慎attributes 参考 对 inline 属性给出的注意事项是错误地内联函数会让程序变慢Incorrectly inlining functions can make the program slower因此该属性应当谨慎使用。由此可以得出使用时的判断标准你希望函数在调用点被展开以减少调用开销时使用#[inline(always)]你希望明确排除内联展开时使用#[inline(never)]由于这只是提示最终行为仍由编译器的内部启发式决定且文档没有承诺可观测的内联结果在把属性当作性能手段之前应以构建通过与实际运行表现为准而不是假定属性一定生效。如果构建失败且报错内容不是上述 inline 诊断说明问题出在函数本身的语法或其他属性上应先排除与内联无关的错误再回到本文的标注步骤。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考