概览 NI LabVIEW 省略了 开发 软件时 需要 手动 管理 内存。LabVIEW 编译器 始终 会 分析 您 的 代码, 以 确定 如何 优 化 性能 并 减少 所需 的 内存 量。但是, 想要 更多 控制 内存 分配 的 高级 用户 可以 在 LabVIEW 2009 中创建 数据 引用。
内容
-
背景
-
基本示例
-
对类使用引用
-
其他资源
背景 分支 线路 通常 要求 LabVIEW 在 线路 上 创建 数据 的 副本。如果两个分支都修改该值,或者如果一个分支在使用原始值完成之前修改该值,则始终如此。使用 LabVIEW 工具 中的 “显示 缓冲 器 分配” 选项 来 突出显示 编 譯 器 将 分配 额外 内存 的 位置。 返回页首 基本示例 “新建数据值引用”节点将任何数据作为输入,并创建对数据的引用。请注意,如果数据被分叉并在其他地方使用,则仍可能发生复制。
编辑
添加图片注释,不超过 140 字(可选)
图1.“新建数据值引用”节点创建对数据的引用,可用于以序列化方式传输和访问数据。 两个新节点可用于就地元素结构,以对数据进行操作,并在原始内存位置替换数据。同一个VI中可以存在多个就地元素结构,但一次只能对来自参考的数据进行操作,因为它们是阻塞函数以防止竞争条件。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图2.此VI代码段说明了如何使用此功能的示例。要在LabVIEW 2009中尝试此示例,请将图像拖到框图中。 为了帮助您理解此图,请考虑下图中显示的各个组件:
-
为其创建引用的数据的值为 5。
-
“新数据值”Reference.vi 为这位数据创建引用。
-
这是数据引用的常量外观的示例。
-
就地元素结构具有一对用于数据值引用读/写的节点,分别用于取消引用和重新引用数据。此结构阻止执行使用相同引用的其他结构,直到它完成并且数据被重新引用。
-
如果引用无效,则数据值引用读取节点的错误输出线为“True”。您还将从写入值引用节点收到此工作,因此您不必合并这些错误。
-
“删除数据值”Reference.vi 结束引用的生存期并返回最后一个已知值。
-
这是前面板指示器的终端示例。
错误处理 如果 您 需要 同时 获取 多个 参考, LabVIEW 将 在 结构 边界 处 等待, 直到 获取 了 所有 参考 源。如果任何引用是错误的引用,则必须将所有错误合并在一起,然后才能知道是否要执行任何工作。 返回页首 对类使用引用 可以将数据引用用于任何数据类型,包括类。LabVIEW 类 具有 分层 关系, 对 类 的 引用 模拟 该 层次 结构。换句话说,期望父类引用的子VI可以传递子类引用。 LabVIEW 类 的 配置 选项 可 让 您 能够 限制 创建 和 销毁 对 类 成员 VI 的 引用。您可以保证,只要您在任何其他VI的图上遇到该类型,对该类的任何引用都是通过正确的初始化方法定义的。
编辑
添加图片注释,不超过 140 字(可选)
图3.您 可以 从 LabVIEW 类 的 属性 对话框 中 限制 对 类 的 引用 的 创建 和 删除。 如果类被标记为只有成员VI可以为该类创建引用,那么当您尝试在任何其他VI的图上创建对该类类型的引用时,New Data Reference函数就会中断 - 默认情况下启用此功能。不能限制对类的集群或类的数组的引用。 必须在运行时维护引用的类型,这意味着不能交换数据值。借助 新的 保留 运行 时间 Class.vi 基元, LabVIEW 可以 保证 运行 时间 类型 的 一致性, 您 可以 使用 该 来 交换 两个 值。如果需要允许您更改基础对象的类引用,请创建对该类的集群的引用。这使您能够以分层强制转换为代价交换值。
编辑
添加图片注释,不超过 140 字(可选)
图4.“保留运行时 Class.vi”使您能够交换不同引用的值。 第二个选项允许父类成为所有后代类型引用的独占工厂,默认情况下禁用。该限制的工作方式与对类本身的引用的限制相同。 如果您有子类的数据引用,则可以使用“到更多”Generic.vi 向上转换为父类引用。同样,以后可以使用“到更多”Specific.vi 将引用恢复为原始类型。当您将 ref-to-child-class 连线连接到 ref-to-parent-class 终端时,会出现向上投射强制点。